Хм.. Там кода много и он не нужен для вопроса, как мне казалось, но если надо, так вот:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<style type="text/css">
</style>
</head>
<body>
<div id="controls">
<select id="CurrentYear">
<option value="2011">2011</option>
</select>
<select id="CurrentMonth">
<option value="01">01 Январь</option>
</select>
</div>
<div id="myGrid" style="width:100%;height:700px;"></div>
<script type="text/jscript" src="./js/mleibman-SlickGrid/lib/jquery-1.7.min.js"></script>
<script type="text/jscript" src="./js/mleibman-SlickGrid/lib/jquery-ui-1.8.16.custom.min.js"></script>
<script type="text/jscript" src="./js/mleibman-SlickGrid/lib/jquery.event.drag-2.0.min.js"></script>
<script type="text/jscript" src="./js/mleibman-SlickGrid/slick.core.js"></script>
<script type="text/jscript" src="./js/mleibman-SlickGrid/slick.editors.js"></script>
<script type="text/jscript" src="./js/mleibman-SlickGrid/slick.grid.js"></script>
<script type="text/jscript" >
var grid;
var data = [];
var curMonth;
var curYear;
var columns=[];
var temp;
// создаём статические столбцы.
temp = columns.push({ id: "fio", name: "Сотрудник", field: "fio", width: 250, cssClass: "cell-title" });
//!!!!!!! Вот он!!!
//создаём регексп для работы с данными (12#2)
var re = new RegExp("(\\d*)#(\\d*)", "ig");
// создаём динамические столбцы и функции
var number = 31; // hardcoded забитое количество столбцов. Дальше надо будет вычислять это количество
var NumericRangeFunc = createFormatterS(number);
for (var i = 1; i <= number; i++) {
temp = columns.push({ id: "day" + i, name: i, width: 40, formatter: NumericRangeFunc[i].f, editor: NumericRangeFunc[i].e });
}
var options = {
editable: true,
enableAddRow: false,
enableCellNavigation: true,
asyncEditorLoading: false
};
setMonth();
function setMonth() {
$("#CurrentMonth option[value='06']").attr("selected", "selected");
curMonth = $("#CurrentMonth option:selected").val();
curYear = $("#CurrentYear option:selected").val();
}
// Создает number таких функций - форматтеров и возвращает их массив.
function createFormatterS(number) {
var arr = [];
for (var i = 1; i <= number; i++) {
arr[i] = {f:createNumericRangeFormatter(i),e:createNumericRangeEditor(i)};
}
return arr;
}
//устанавливает текущие значения месяца и года
// Создает Элемент массива функций - форматтеров.
function createNumericRangeFormatter(n) {
return function (row, cell, value, columnDef, dataContext) {
var retStr = '';
if (dataContext["d" + n] != null && dataContext["d" + n].toString().length > 0) {
//!!! А вот использование. Ну и дальше по коду кое-где.
re.lastIndex = 0;
var arr = re.exec(dataContext["d" + n]);
if (arr != null) {
if (!isNaN(parseInt(arr[1], 10)) && !isNaN(parseInt(arr[2], 10))) {
retStr = arr[1] + "<sub>/" + arr[2] + "</sub>";
}
//if (msg['MSH']['MSH.4']['MSH.4.1'] != null && msg['MSH']['MSH.4']['MSH.4.1'].toString().length > 0)
}
}
return retStr;
}
}
// Создает Элемент массива функций - Редакторов ячеек.
function createNumericRangeEditor(n) {
return function NumericRangeEditor(args) {
var $startTime, $LenghtTime;
var scope = this;
this.init = function () {
$startTime = $("<INPUT type=text style='width:20px' />")
.appendTo(args.container)
.bind("keydown", scope.handleKeyDown);
$(args.container).append(" to ");
$LenghtTime = $("<INPUT type=text style='width:20px' />")
.appendTo(args.container)
.bind("keydown", scope.handleKeyDown);
scope.focus();
};
this.handleKeyDown = function (e) {
if (e.keyCode == $.ui.keyCode.LEFT || e.keyCode == $.ui.keyCode.RIGHT || e.keyCode == $.ui.keyCode.TAB) {
e.stopImmediatePropagation();
}
};
this.destroy = function () {
$(args.container).empty();
};
this.focus = function () {
$startTime.focus();
};
this.serializeValue = function () {
var t = {}; //временная переменная для возврата объекта
t["d" + n] = $startTime.val() + "#" + $LenghtTime.val();
return t;
};
this.applyValue = function (item, state) {
re.lastIndex = 0;
var arr_item = re.exec(item["d" + n]);
re.lastIndex = 0;
var arr_state = re.exec(state["d" + n]);
//если один из компонентов обнулился
// если старый - значит пришли новые данные. всё правильно
// если новый - нужно вызвать удаление на сервере. ///ТД не реализовано
if (arr_item == null) {
arr_item = [];
arr_item[1] = "";
arr_item[2] = "";
}
if (arr_state == null) {
arr_state = [];
arr_state[1] = "";
arr_state[2] = "";
}
// проверяем что что-то изменилось и если так
if (arr_item[1] != arr_state[1] || arr_item[2] != arr_state[2]) {
//заполняем данные в рабочий массив из текущего состояния
item["d" + n] = arr_state[1] + "#" + arr_state[2];
var str = n + "/" + curMonth + "/" + curYear + " " + arr_state[1] + ":00:00";
// refactor to UpdateServerData
$.get("/qResult.aspx",
{ pck: "jsontest_update",
startd_: str,
endd_: arr_state[2], // item["d" + n],
employee_post_id_: item["employee_post_id"]
},
function (ret) {
alert("Обновлено!")
});
}
};
//Данные из ячейки массива в поля контрола редактирования значения
this.loadValue = function (item) {
if (item["d" + n] != null && item["d" + n].toString().lenght > 0) {
re.lastIndex = 0;
var arr = re.exec(item["d" + n]);
$startTime.val(arr[1]);
$LenghtTime.val(arr[2]);
}
};
this.isValueChanged = function () {
return args.item.startd != parseInt($startTime.val(), 10) || args.item.endd != parseInt($startTime.val(), 10);
};
this.validate = function () {
if (isNaN(parseInt($startTime.val(), 10)) || isNaN(parseInt($LenghtTime.val(), 10))) {
return { valid: false, msg: "Можно вводить только числа." };
}
if ((parseInt($startTime.val(), 10) + parseInt($LenghtTime.val(), 10)) > 24) {
return { valid: false, msg: "Общая продолжительность суток не более 24 часов" };
}
return { valid: true, msg: null };
};
this.init();
}
}
$(function () {
$.get("/qResult.aspx",
{ pck: "jsontest" },
function (ret) {
// поиск и отображение юзверей старта.
//debugger;
var json = JSON.parse(ret);
if (json) {
var row_count = json.length;
var column_count = json[0].s.length;
var columns_names = []
//создание названий объектов для ассоциативного массива
for (var col = 0; col < column_count; col++) {
columns_names[col] = json[0].s[col].toLowerCase();
}
// в первой строке у нас заголовки. Загружаем всё со второй (row=1). для удаления пустой строки: data[row-1]
for (var row = 1; row < row_count; row++) {
var d = (data[row - 1] = {});
for (var col = 0; col < column_count; col++) {
d[columns_names[col]] = json[row].s[col];
}
}
grid = new Slick.Grid("#myGrid", data, columns, options);
grid.onValidationError.subscribe(function (e, args) {
alert(args.validationResults.msg);
});
} else {
}
}
);
})
</script>
</body>
</html>
Ну и пример строки - это или 2#2 или 12#5 или 02#12 ну и тому подобные 2-х циферные сочетания разделённые #