【问题标题】:c# using previous datatable column valuec# 使用先前的数据表列值
【发布时间】:2017-06-01 17:39:33
【问题描述】:

在我的项目中。我有一个数据表和一个名为“进程”的按钮

单击“处理”按钮后,我的数据表列更改为新值(如下所示)

是否可以取回这些更改的值(在我单击按钮之前),因为我需要将它们与新值一起显示(当我单击按钮时)

这是我目前的代码:

        for (int l = 0; l < my_datatable.Rows.Count; l++)
        {
            data_source = my_datatable.Rows[l][3].ToString();

            if (data_source.Contains("Cross Site Scripting"))
            {
                my_datatable.Rows[l][3] = "2";
            }
            else if (data_source.Contains("SQL Injection"))
            {
                my_datatable.Rows[l][3] = "3";
            }
            else if (data_source.Contains("Unicode Attack"))
            {
                my_datatable.Rows[l][3] = "4";
            }
            else if (data_source.Contains("Proxy Attack"))
            {
                my_datatable.Rows[l][3] = "5";
            }
            else
            {
                my_datatable.Rows[l][3] = "1";
            }
        }

【问题讨论】:

  • 你好...我有一个解决方案,我想如果你还需要的话。

标签: c# datatable


【解决方案1】:
var dictionary = new Dictionary<int, string>();
for (int l = 0; l < my_datatable.Rows.Count; l++)
{
    data_source = my_datatable.Rows[l][3].ToString();
    dictionary.Add(l, data_source);

    // ...
}
// Access:
dictionary[0] // Returns the previous string

我会选择使用Dictionary&lt;TKey, TValue&gt; 根据DataTable 中的行索引来存储字符串。通过使用Dictionary&lt;TKey, TValue&gt;.Add(key, value) 方法,它将其存储以供以后使用。

从其中访问字符串值时,您可以将其视为关联数组,只需使用Dictionary&lt;TKey, TValue&gt;[index]

希望对您有所帮助!

【讨论】:

    【解决方案2】:

    如果您在更改数据表之前复制它,您应该能够做到。

    var dataCopy = my_datatable.Copy();
    

    您唯一需要做的就是跟踪您更改了哪一行中的哪些字段。

    考虑一下,使用以下一些方法可能会有更好的解决方案。如果不进行研究,我无法回忆起确切的细节,但它们可能会有一些用处。

     if (row.RowState == DataRowState.Modified)
     {
          var currentRow = row[0, DataRowVersion.Current];
          var previousRow = row[0, DataRowVersion.Proposed];
     }
    

    然后您可以使用它来获取两个值

    或者还有

     var modifiedTable = my_datatable.GetChanges(DataRowState.Modified)
    

    再次您好...我做了一些实验,我相信下面的内容会满足您的需求。它基于我创建的用于演示的简单数据表。

                var data = new DataTable("Table1");
                data.Columns.Add(new DataColumn("Username", typeof(string)));
                data.Columns.Add(new DataColumn("UserId", typeof(int)));
    
                var row = data.NewRow();
                row["Username"] = "User1";
                row["Userid"] = 12356;
                data.Rows.Add(row);
    
                data.AcceptChanges();
    
                var originalTable = data.Copy();
    
                var rowToEdit = data.Rows[0];
                rowToEdit["Username"] = "User2";
    
                var rowPos = 0;
    
                foreach (DataRow dr in data.Rows)
                {
                    if (dr.RowState == DataRowState.Modified)
                    {
                        foreach (DataColumn c in dr.Table.Columns)
                        {
                            if (dr.ItemArray[c.Ordinal] != originalTable.Rows[rowPos].ItemArray[c.Ordinal] )
                            {
                                //Show Changed value
                                var x = originalTable.Rows[rowPos].ItemArray[c.Ordinal];
                            }
                        }
                    }
    
                    rowPos++;
                }
    

    谢谢

    【讨论】:

    • @AliffM。 - 嗨.. 我在答案中添加了额外的内容供您探索,这应该会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多