【问题标题】:Datatable updating without using datarow loop不使用数据行循环的数据表更新
【发布时间】:2023-03-27 09:25:01
【问题描述】:

是否可以做到以下几点:

我有以下数据表

=================================
ID      ||   Width  ||  Value  ||
=================================
size-1  ||   50     ||         ||
name-1  ||   100    ||         ||
zip-1   ||   50     ||         ||
size-2  ||   50     ||         ||
name-2  ||   100    ||         ||
zip-2   ||   50     ||         ||
=================================

我希望能够循环遍历数据表并使用 textcontrolbox.text 值更新值列

Session[sectionName] = test;
DataTable dt = (DataTable)Session[sectionName];

        var strIDS = from p in dt.AsEnumerable()
                     select new
                     {
                         ID = p.Field<string>("ID")
                     };

        foreach (var strID in strIDS)
        {
            TextBox tempBox = DynamicControlsHolder1.FindControl(strID.ID) as TextBox;
            string val = tempBox.Text;

            // This is where i want to be able to update the value column, but i can't figure out how to
            // Can someone please help

        }

【问题讨论】:

    标签: c# asp.net linq datatable


    【解决方案1】:

    您的整个代码可以替换为:

    foreach (DataRow Row in dt.Rows)
        Row["Value"] = (DynamicControlsHolder1.FindControl(Row["ID"]) as TextBox).Text;
    

    【讨论】:

    • +1 简单使用传统的foreach,其实我比LINQ更喜欢这种风格,LINQ只是为了OP的要求。 LINQ 并不总是最好的,但很多人总是尽可能多地使用它。
    • 哇,我喜欢这种方式,它看起来更干净,但是当我现在尝试时,它说 findcontrol 有一些无效的参数,我必须添加以下内容:foreach(DataRow Row在 dt.rows)
    • 它成功了,我只需要添加以下内容即可:foreach (DataRow Row in dt.Rows) { Row["Value"] = (DynamicControlsHolder1.FindControl((string)Row[ "ID"]) 作为 TextBox).Text; }
    • 啊,foreach(DataRow r in dt) 可以很好地处理类型化数据集。我会更新我的代码。
    【解决方案2】:
    int i = 0;
    foreach (var strID in strIDS)
        {
            TextBox tempBox = DynamicControlsHolder1.FindControl(strID.ID) as TextBox;
            dt.Rows[i++]["Value"] = tempBox.Text;
        }
    

    我认为你应该尝试在LINQ 中直接更新,如下所示:

    var totalRows = dt.AsEnumerable()                  
                      .Select(p=>                     
                      {
                         p["Value"] = (DynamicControlsHolder1.FindControl(p.Field<string>("ID")) as TextBox) ?? "";
                         return p;
                      }).Count();
    

    要更新特定的行,你可以试试这个:

    var row = dt.AsEnumerable()
                .Where(p=>p.Field<string>("ID") == "ID you want").FirstOrDefault();
    if(row != null) row["Value"] = (DynamicControlsHolder1.FindControl(row["ID"].ToString()) as TextBox).Text;
    

    【讨论】:

    • -1。不能保证行是有序的。他需要按 ID 查找行。
    • 啊,我现在明白了。很抱歉造成混乱。
    • 如果只需要更新一个特定的行,有没有办法通过使用 findbyid 来做到这一点,即使我的数据表没有主键?
    • @user2593590:请参阅下面的答案。
    猜你喜欢
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 2020-07-12
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多