使DataGridView可视化地反映其DataSource中的更改的正确方法

时间:2009-03-10 14:06:32

标签: c# winforms ado.net datagridview

假设DataGridViewDataSource属性设置为DataView个实例。

DataGridView dgv;
DataTable dt;

// ... dt gets populated.

DataView dv = dt.DefaultView;

dgv.DataSource = dv;

// ... dt gets modified

// The DataGridView needs to update to show these changes visually
// What goes here?

我知道您可以将dgv.DataSource设置为null,然后返回dv。但这看起来很奇怪。我也相信还有其他几种方式。但是,正确的官方方式是什么?

2 个答案:

答案 0 :(得分:4)

正确的方式是让数据源实现IBindingList,为true返回SupportsChangeNotification,并发出ListChanged个事件。但是,AFAIK,DataView 确实这个......

答案 1 :(得分:2)

我很确定如果您将DataGridView绑定到DataTable的DefaultView,并且Table更改,则更改会自动反映在DataGridView中。你试过这个并遇到问题吗?发布您更新DataTable的代码,可能还有其他错误。事实上,这是我刚刚写的一个小样本应用程序:

public partial class Form1 : Form
    {
        private DataTable table;

        public Form1()
        {
            InitializeComponent();
            table = new DataTable();
            this.LoadUpDGV();
        }

        private void LoadUpDGV()
        {
            table.Columns.Add("Name");
            table.Columns.Add("Age", typeof(int));

            table.Rows.Add("Alex", 27);
            table.Rows.Add("Jack", 65);
            table.Rows.Add("Bill", 22);
            table.Rows.Add("Mike", 36);
            table.Rows.Add("Joe", 12);
            table.Rows.Add("Michelle", 43);
            table.Rows.Add("Dianne", 67);

            this.dataGridView1.DataSource = table.DefaultView;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            table.Rows.Add("Jake", 95);
        }
    }

基本上,当表单加载时,它只会使用名称和年龄填充表格。然后它将它绑定到DGV。单击按钮,它会向DataTable本身添加另一行。我测试了它,果然它在网格中出现没有任何问题。