DataGridView的单元格内容即时更新方法

DataGridView的即时更新方法 收藏
最近用了DataGridView,深有体会,最深刻一点是它的事件。我想很多人都希望编辑表格单元的同时更新其他东西,就好像TextBox的TextChanged事件,但DataGridView却没有提供类似TextChanged那样的事件。我想用下面的一个例子说明如何达到实时更新的效果。

      上面的Form有一个DataGridView实例dataGridView1和一个Label实例label1。dataGridView1有3个字段,分别是班级(DataGridViewComboBoxColumn)、姓名(DataGridViewTextBoxColumn)和成绩(DataGridViewTextBoxColumn)。

现在要实现一个效果,就是如果更改了dataGridView1中任意一个cell(单元格)的值,label1的text就更新为那个cell的值。代码如下:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.dataGridView1.EditingControlShowing +=
                new DataGridViewEditingControlShowingEventHandler(dataGridView1_EditingControlShowing);
        }
        //编辑cell时激发的事件
        void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            if (e.Control.GetType().Equals(typeof(DataGridViewComboBoxEditingControl)))//cell为类ComboBox时
            {
                e.CellStyle.BackColor = Color.FromName("window");
                DataGridViewComboBoxEditingControl editingControl = e.Control as DataGridViewComboBoxEditingControl;
                editingControl.SelectedIndexChanged += new EventHandler(editingControl_SelectedIndexChanged);
            }
            else if (e.Control.GetType().Equals(typeof(DataGridViewTextBoxEditingControl)))//cell为类TextBox时
            {
                e.CellStyle.BackColor = Color.FromName("window");
                DataGridViewTextBoxEditingControl editingControl = e.Control as DataGridViewTextBoxEditingControl;
                editingControl.TextChanged += new EventHandler(editingControl_TextChanged);
            }
        }
        //TextBox的TextChanged事件
        void editingControl_TextChanged(object sender, EventArgs e)
        {
            this.label1.Text = dataGridView1.CurrentCell.EditedFormattedValue.ToString();
        }
        //Combox的SelectedIndexChanged事件
        void editingControl_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.label1.Text = dataGridView1.CurrentCell.EditedFormattedValue.ToString();
        }     
    }

有几点要说明的

1.       EditingControlShowing 是DataGridView自带的事件,当某个cell被编辑时就会激发该事件。接着就到了dataGridView1_EditingControlShowing 函数,然后(if…else if…)判断那个cell是DataGridViewComboBoxEditingControl还是DataGridViewTextBoxEditingControl 控件类型。判断好控件类型之后就可以用该类型自带的事件,例如DataGridViewComboBoxEditingControl 自带的SelectedIndexChanged 事件。

2.       为什么用dataGridView1.CurrentCell.EditedFormattedValue而不是dataGridView1.CurrentCell.Value,因为处于编辑状态的cell的Value是没有同时更新的,我们更改的是它的EditedFormattedValue。这个区别当然有好处,这里不谈。

3.       为什么要加一句e.CellStyle.BackColor = Color.FromName("window") ?实践是检验真理的标准,不妨去掉这句运行一下就清楚了。

 

http://hi.baidu.com/yk±±¼«ÐÇ/blog/item/c4ecc50026862e08738da5f6.html

posted @ 2010-05-13 14:35  chaobj  阅读(11555)  评论(0编辑  收藏  举报