【问题标题】:Iterate thru a datatable and modify values using an if statement遍历数据表并使用 if 语句修改值
【发布时间】:2011-11-21 13:50:05
【问题描述】:

我有一个数据表,我试图使用 for each 循环和一个 if 语句来修改某些值,但是每当我尝试使用 if 语句时,什么都没有发生。如果我删除 if 语句 if 显然只是更改每一行。

我做错了什么?我在 ItemArray.GetValue() 上尝试了不同的值,但仍然没有运气。

            int x = 0;
            foreach ( DataRow myRow in dt.Rows )
            {
                if (dt.Rows [x].ItemArray.GetValue(1).ToString()=="IP")
                {
                    myRow.BeginEdit ( );
                    myRow [ "grd" ] = " ";
                    myRow.EndEdit ( );
                }
                x++;
            }

【问题讨论】:

  • 我解决了这个问题,我将配音建议的 for each 循环与可能是罪魁祸首的 trim() 结合使用。

标签: c# .net datatable foreach


【解决方案1】:

原来我需要添加 trim() 并且它起作用了。

    foreach ( DataRow row in dt.Rows )
            {
                string name = row.ItemArray.GetValue ( 2 ).ToString ( ).ToUpper().Trim();

                if ( name == "IP" )
                {
                    row.BeginEdit();
                    row [ "grd" ] = "-";
                    row.EndEdit();
                }
            }

【讨论】:

    【解决方案2】:

    C# 是区分大小写的,因此实际值很可能不是大写的“IP”,或者可能包含空格等。尝试与 string.Compare 进行比较,使用重载版本,您可以在其中判断大小写为 false灵敏度。

    顺便说一句 - 有几种方法可以检查可能更清晰的值。

    首先,您可以使用 DataTable 公开的 Select 方法将行过滤为仅在索引 1 的列中具有“IP”值的行。您将需要使用列名,所以我假设它在此示例中被命名为“Column1”:

    foreach ( DataRow myRow in dt.Rows.Select("Column1 = 'IP'") )
    {
        myRow.BeginEdit();
        myRow["grd"] = " ";
        myRow.EndEdit();
    }
    

    或者,您可以使用如下 LINQ 语句:

    foreach (DataRow myRow in dt.Rows.Cast<System.Data.DataRow>().Where(r => string.Compare(r[1].ToString(), "IP", true) == 0)
    {
        myRow.BeginEdit();
        myRow["grd"] = " ";
        myRow.EndEdit();
    }
    

    正如 Hand-E-Food 所述,“x”变量在您的示例中没有提供任何功能。

    【讨论】:

      【解决方案3】:

      数组的值是多少?真的是“IP”吗?还是以下之一:“ip”、“Ip”、“iP”?如果大小写无关紧要,对字符串使用 .ToUpper() 可能会有所帮助。

      回答您的第二个问题:如果您使用数据适配器,那么您只需填写一个数据集并拉出数据集中的第一个表。

      DataSet ds = new DataSet();
      dataAdapter.fill(ds);
      DataTable myTable = ds.Tables[0];
      

      【讨论】:

        【解决方案4】:

        请确保您正在初始化 DataTable 列,更重要的是请确保您在 index = 1 处插入一个值。我运行了以下代码,并且在评估“if”语句时没有遇到任何问题。我还删除了您正在使用的计数器,因为每个循环都不需要它,因为您可以直接访问每一行的 ItemArray。

          DataTable table = new DataTable();
          table.Columns.Add("ID");    //Allows for storage at GetValue(0)
          table.Columns.Add("NAME");  //Allows for storage at GetValue(1)
        
          //GetValue(0) will return 128|256; GetValue(1) will return IP | OP.
          table.Rows.Add(new object[] {"128", "IP"});  
          table.Rows.Add(new object[] {"256", "OP"});
        
          foreach(DataRow row in table.Rows)
          {
                string name = row.ItemArray.GetValue(1).ToString();
        
                if(name == "IP")
                {
                     Console.WriteLine("IP was found");
                     //Of course do your edits here.
                }
          }
        

        【讨论】:

        • 如果我从使用 odbc 连接 /sql 获取数据的数据适配器填充数据表,我将如何初始化列?
        【解决方案5】:

        对于初学者来说,变量x 是多余的。可以简单参考:

        if (myRow.ItemArray.GetValue(1).ToString()=="IP")
        

        这应该会减少代码中的一些混乱。

        if 语句上放置一个断点,以查看循环的每次迭代中GetValue(1).ToString() 的实际值是多少。您可能正在检索错误的值。

        【讨论】:

          猜你喜欢
          • 2011-09-04
          • 1970-01-01
          • 1970-01-01
          • 2020-09-03
          • 2022-11-23
          • 2015-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多