Как изменить определенные данные столбца в таблице данных в соответствии с некоторыми условиями - PullRequest
0 голосов
/ 05 февраля 2012

У меня есть следующий случай:

Я добавляю строку за строкой к Datatable dtItems в соответствии с вводом пользовательских данных с помощью кнопки.

Один из столбцов в моей таблице данных - Hours, и я хочу выполнить следующие условия:

  • 1 - для каждого пользователя общее количество часов меньше или равно 5.
  • 2 - по умолчанию: если пользователь вводит одну строку, то часы = 5

    если он входит в два ряда, то первый из них становится 4, а второй - 1

    если он входит в три ряда, то первый из них равен 3, а второй - 1, а третий - 1.

    и т.д.

  • 3 - максимальное количество строк для каждого пользователя - 5.

НРАВИТСЯ это:

user_id | имя | часы


323 | Джо | 3

323 | Джо | 1

323 | Джо | 1

324 | Джек | 4

324 | Джек | 1


DataTable dtItems = GetDataTable();
DataRow dr = dtItems.NewRow();
dr["emp_num"] = txt_EmpNum.Text.Trim();
dr["name"] = txt_EmpName.Text.Trim();
dr["hours"] = 5;
dtItems.Rows.Add(dr);

GV_Employee.DataSource = dtItems;
GV_Employee.DataBind();

Session["ItemDT"] = dtItems;

1 Ответ

1 голос
/ 05 февраля 2012

Я предполагаю, что вы не знаете, как соответствующим образом изменить поля Hour в DataRow, прежде чем вставлять их в базу данных.

Единственное, что вам нужно знать, это новый hour первогоDataRow, остальные получают 1 час:

var firstHour = 5 + 1 - dtItems.Rows.Count; //where 5 is your MaxCount
for (var i = 0; i < dtItems.Rows.Count; i++) {
    if (i == 0) 
        dtItems.Rows[i]["hours"] = firstHour;
    else
        dtItems.Rows[i]["hours"] = 1;
}

Чтобы пользователи не могли вставлять более 5 строк, вам нужно только проверить на dtItems.Rows.Count < 5, прежде чем вставить новую.


Редактировать : Если вам нужно, чтобы его рассчитывали для каждого emp_num в DataTable, как прокомментировано:

var q = from r in dtItems.AsEnumerable()
        group r by r["emp_num"];

foreach(var empGrp in q){
    var rows=empGrp.ToList();
    var firstHour = 5 + 1 - rows.Count;
    for (var i = 0; i < rows.Count; i++){
        if (i == 0)
            rows[i]["hours"] = firstHour;
        else
            rows[i]["hours"] = 1;
    }
}
...