如何改变一个DatatTable里面的数值,同时能够改变另外一个DataTable里面的数值。

时间:2022-03-14 04:25:30
我有2个DataTable,Table1和Table2,
我想实现当我改变Table1里面的一个数据的时候,
通知Table2,Table2会自动根据Table1里面的变化而变化Table2里面的数据的一个数据,
注意:是改变一个数据,而不是成批的更新。
大家有什么办法吗?

我想实现的其实就像Excel一样的功能,当Sheet1里面的一个数值改变的时候,
我可以让Sheet2里面的对应的某个数值发生改变,在Excel里面是通过设置公式来实现的,

DataTable是否能大致实现这种思路,望高手支招。

13 个解决方案

#1


不懂,帮顶,接分。

#2


使用事件就好了
using System;
using System.Data;
public class test
{
         DataTable dt1, dt2;
        public test()
        {
            dt1 = new DataTable();
            dt2 = new DataTable();
            dt1.Columns.Add("ID");
            dt1.Columns.Add("AA");
            dt1.Columns.Add("BB");
            dt2.Columns.Add("ID");
            dt2.Columns.Add("AA");
            dt2.Columns.Add("BB");
            dt1.Rows.Add(new object[] { "1", "Row1_1", "Row1_2" });
            dt1.Rows.Add(new object[] { "2", "Row2_1", "Row2_2" });
            dt2.Rows.Add(new object[] { "1", "Row1_1", "Row1_2" });
            dt2.Rows.Add(new object[] { "2", "Row2_1", "Row2_2" });
            dt1.RowChanged += new DataRowChangeEventHandler(dt1_RowChanged);//绑定事件,
            MessageBox.Show("dt2行1列AA的值:" + dt2.Rows[0]["AA"].ToString());
            dt1.Rows[0]["AA"] = "ChangeValue";//更改值后会触发dt1_RowChanged,同时更新数据相同的行
        }

        void dt1_RowChanged(object sender, DataRowChangeEventArgs e)
        {
            DataRow dr1 = e.Row;
            DataRow dr2 = null;
            foreach (DataRow d in dt2.Rows)
            {
                if (d["ID"].ToString() == dr1["ID"].ToString())//通过ID找到同一行
                {
                    dr2 = d;
                    break;
                }
            }
            if (dr2 == null) return;//找不到行
            //更新行
            for (int i = 1; i<dt2.Columns.Count; i++)
                dr2[i] = dr1[i];
            MessageBox.Show("dt2行1列AA的值:" + dt2.Rows[0]["AA"].ToString());
        }
public static void Main(string []Args)
{
   test t=new test();
}
}

#3


可不可以在Table1改变的时候将变更的数据放入ViewState中,
然后进行判断来更新Table2

#4


二楼的方法可以,但不够好,好的做法是数据模型提供值改变的事件,显示部分响应,这样无论有多少个控件以任何一种方式显示数据都会很容易的实现

#5


应该是可以的,本来excel和table是相通的.

#6


学习~

#7


我的情况要比“iloveC#”的情况复杂,

我可能是Table1里面2行的数据,引起Table2里面一行数据的变化,
并且他们ID的是不同的,

我说一下我的场景吧,
Table1里面记录了原始的货币对,比如
Symbol  Mid
USDHKD  10
USDJPY  2
NZDCNY  0.5

而Table2里面那是这样的,
HKDJPY  5     //我来解释一下5是怎么来的,是USDHKD/USDJPY=10/2 而来
CNYNZD  2     //我来解释一下2是怎么来的,是1/NZDCNY=1/0.5而来。

每当Table里面的数据发生变化,我要导致Table里面相应的有关系的数据发生变化。
请大家继续。
谢谢“iloveC#”的代码,很有启发。
能否像Excel一样实现定义公式那

#8


谢谢大家的回复。
24K纯爷们,纯的!!!!!!说明一下详细的步骤。
成长说明一下如何可以像Excel一样,我能够设置DataCoulume公式,但是DataRow怎么设置那。
再次谢谢大家。请继续。

#9


在更新前加个计算过程,算出要更新的值,关系绑定不懂咋搞,暂时没学过.....

#10


订一下

#11


用触发器!

#12


我觉得公式绑定有点困难啊,你拿.net的一个类和一个应用软件比,这个.......

#13


.Net,C#之人生无悔DataTable有触发器吗?
iloveC#.net类无法和Excel无法比,我就是想知道有没有办法(小技巧也可以)能够大致的实现这个功能,
如果不能,那我只能是If判断了。加上改变Tabel1和Table2的结构,加各种标识来判断出来。然后用的你方法来更新Tabel2的数据。

#1


不懂,帮顶,接分。

#2


使用事件就好了
using System;
using System.Data;
public class test
{
         DataTable dt1, dt2;
        public test()
        {
            dt1 = new DataTable();
            dt2 = new DataTable();
            dt1.Columns.Add("ID");
            dt1.Columns.Add("AA");
            dt1.Columns.Add("BB");
            dt2.Columns.Add("ID");
            dt2.Columns.Add("AA");
            dt2.Columns.Add("BB");
            dt1.Rows.Add(new object[] { "1", "Row1_1", "Row1_2" });
            dt1.Rows.Add(new object[] { "2", "Row2_1", "Row2_2" });
            dt2.Rows.Add(new object[] { "1", "Row1_1", "Row1_2" });
            dt2.Rows.Add(new object[] { "2", "Row2_1", "Row2_2" });
            dt1.RowChanged += new DataRowChangeEventHandler(dt1_RowChanged);//绑定事件,
            MessageBox.Show("dt2行1列AA的值:" + dt2.Rows[0]["AA"].ToString());
            dt1.Rows[0]["AA"] = "ChangeValue";//更改值后会触发dt1_RowChanged,同时更新数据相同的行
        }

        void dt1_RowChanged(object sender, DataRowChangeEventArgs e)
        {
            DataRow dr1 = e.Row;
            DataRow dr2 = null;
            foreach (DataRow d in dt2.Rows)
            {
                if (d["ID"].ToString() == dr1["ID"].ToString())//通过ID找到同一行
                {
                    dr2 = d;
                    break;
                }
            }
            if (dr2 == null) return;//找不到行
            //更新行
            for (int i = 1; i<dt2.Columns.Count; i++)
                dr2[i] = dr1[i];
            MessageBox.Show("dt2行1列AA的值:" + dt2.Rows[0]["AA"].ToString());
        }
public static void Main(string []Args)
{
   test t=new test();
}
}

#3


可不可以在Table1改变的时候将变更的数据放入ViewState中,
然后进行判断来更新Table2

#4


二楼的方法可以,但不够好,好的做法是数据模型提供值改变的事件,显示部分响应,这样无论有多少个控件以任何一种方式显示数据都会很容易的实现

#5


应该是可以的,本来excel和table是相通的.

#6


学习~

#7


我的情况要比“iloveC#”的情况复杂,

我可能是Table1里面2行的数据,引起Table2里面一行数据的变化,
并且他们ID的是不同的,

我说一下我的场景吧,
Table1里面记录了原始的货币对,比如
Symbol  Mid
USDHKD  10
USDJPY  2
NZDCNY  0.5

而Table2里面那是这样的,
HKDJPY  5     //我来解释一下5是怎么来的,是USDHKD/USDJPY=10/2 而来
CNYNZD  2     //我来解释一下2是怎么来的,是1/NZDCNY=1/0.5而来。

每当Table里面的数据发生变化,我要导致Table里面相应的有关系的数据发生变化。
请大家继续。
谢谢“iloveC#”的代码,很有启发。
能否像Excel一样实现定义公式那

#8


谢谢大家的回复。
24K纯爷们,纯的!!!!!!说明一下详细的步骤。
成长说明一下如何可以像Excel一样,我能够设置DataCoulume公式,但是DataRow怎么设置那。
再次谢谢大家。请继续。

#9


在更新前加个计算过程,算出要更新的值,关系绑定不懂咋搞,暂时没学过.....

#10


订一下

#11


用触发器!

#12


我觉得公式绑定有点困难啊,你拿.net的一个类和一个应用软件比,这个.......

#13


.Net,C#之人生无悔DataTable有触发器吗?
iloveC#.net类无法和Excel无法比,我就是想知道有没有办法(小技巧也可以)能够大致的实现这个功能,
如果不能,那我只能是If判断了。加上改变Tabel1和Table2的结构,加各种标识来判断出来。然后用的你方法来更新Tabel2的数据。