【问题标题】:How to change specific column data in the datatable according to some condition如何根据某些条件更改数据表中的特定列数据
【发布时间】:2012-02-05 11:17:00
【问题描述】:

我有以下情况:

我根据用户数据通过按钮逐行添加到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;

【问题讨论】:

    标签: c# asp.net .net datatable datarow


    【解决方案1】:

    我假设您在将 DataRow 的 Hour 字段插入数据库之前不知道如何相应地更改它们。

    你只需要知道第一个DataRow的新hour,其他的得到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 &lt; 5


    编辑:如果您需要为DataTable 中的每个emp_num 计算它的注释:

    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;
        }
    }
    

    【讨论】:

    • 非常感谢,嗯,不,我想all employees,但条件是每个emp_num,请看上面的表格,我编辑它以澄清这个想法
    • @just_name:再次编辑了我的答案,我认为现在应该可以了。否则你现在应该知道在哪里摆弄;)
    猜你喜欢
    • 2022-09-23
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多