DataGridView的添加、编辑、更新
转载于 太上老君的个人资料
今天说说DataGridView吧,在一个小项目中用到了这个。面对的问题是要在DataGridView中编辑、更新其中的值,然后怎么回写到数据库中?一开始的想法也是用循环读取Cell,然后自己手动回写到数据库中,但总觉得不方便,认为微软会把这些工作封装好的,就上网查了一下,发现确实有这个功能。先描述一下数据库中的结构
    1                                              2
ID Name SexID                      ID   Sex
1      A      1                           1     
2      B      2                          2     
3      C      2
 
一开始的绑定是很容易的,但绑定后更新不了数据库中的值,一更新就提示SexID的值是没设置数据源的,因为SexID是外键。还好在网上查到了一个折中的解决办法,是在建立一个DataTable自己做映射:
    DataTable dtRelation = new DataTable();
    dtRelation.Columns.Add("Code",typeof(byte));
    dtRelation.Columns.Add("DisplayString",typeof(string));
    dtRelation.Rows.Add(new object[] { 0, "苹果" });
    dtRelation.Rows.Add(new object[] { 1, "香蕉datagridview数据源" });
    dtRelation.Rows.Add(new object[] { 2, "西瓜" });
    2.设置下拉列表列(DataGridViewComboxColumn)属性:
    下拉列表列.DataSource = dtRelation;
    下拉列表列.ValueMember = "Code";
    下拉列表列.DisplayMember = "DisplayString";   
    下拉列表列.DataPropertyName = 数据源.列名;
 
后来我发现其实不用DataTable也可以直接让DataGridView完成绑定2个表的操作,而且更新时是可以直接更新的:
        SqlDataAdapter da;
        SqlCommand cmd;
        SqlCommandBuilder cmdBuilder;
        DataSet ds;
        private void DataBind()
        {
            da = new SqlDataAdapter(cmd);
            cmdBuilder = new SqlCommandBuilder(da);
            ds = new DataSet();
            da.Fill(ds, "Students");
            dataGridView1.AutoGenerateColumns = false;
            //绑定数据源
            dataGridView1.DataSource = ds.Tables["Students"];
            Column1.DataPropertyName = ds.Tables["Students"].Columns[1].ColumnName;
            Column2.DataPropertyName = ds.Tables["Students"].Columns[2].ColumnName;
            Column3.DataPropertyName = ds.Tables["Students"].Columns[3].ColumnName;
           
            //初始化性别
            string sql_Sex = "select * from Sex";
            SqlCommand cmd_Sex = new SqlCommand(sql_Sex, Main.Conn);
            SqlDataAdapter da_Sex = new SqlDataAdapter(cmd_Sex);
            DataSet ds_Sex = new DataSet();
            da_Sex.Fill(ds_Sex, "Sex");
            Column3.DataSource = ds_Sex.Tables["Sex"];
            Column3.DisplayMember = "Value";
            Column3.ValueMember = "ID";
        }
        string sqlSTR = "select * from Students";
        cmd = new SqlCommand(sqlSTR, Main.Conn);
        DataBind();
至此,我们已经成功将DataGridView绑定了2个表,而且不用DataTable做中间层。关键就在:
DataSource                                      //设定要绑定的数据源
DataPropertyName                          //设置更新后回写到数据库的哪一列,多表时要把数据源也写上
DisplayMember                                //设置要显示在DataGridView的字段
ValueMember                                   //设置对应DisplayMember的实际值的字段
这几个属性上。
 
在更新回数据源时还有一点要注意,就是绑定数据源时一定要有主键,这样你只要设置SqlDataAdapter中的SelectCommand属性,其余的UpdateCommandDeleteCommandInsertCommand属性就会自动设置、并完成相应的功能:
            try
            {
              da.Update(ds.Tables[0].GetChanges());
              MessageBox.Show("数据处理成功!");
              ds.Tables[0].AcceptChanges();
            }
            catch (Exception Error)
            {
                MessageBox.Show(Error.Message,);
            }
举一反三、能成功绑定2个表,也一样可以绑定多个表!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。