zoukankan      html  css  js  c++  java
  • 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, "香蕉" });
        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属性,其余的UpdateCommand、DeleteCommand、InsertCommand属性就会自动设置、并完成相应的功能:

                try
                {
                   da.Update(ds.Tables[0].GetChanges());
                   MessageBox.Show("数据处理成功!");
                   ds.Tables[0].AcceptChanges();
                }
                catch (Exception Error)
                {
                    MessageBox.Show(Error.Message,);
                }

    举一反三、能成功绑定2个表,也一样可以绑定多个表

  • 相关阅读:
    序列、元组、列表(基本的增、删、改、查)
    Python基础运算符(算数、比较、赋值、逻辑、成员)
    2015年9月14日记事
    2014年3月31日梦
    华为S5700系列交换机配置文件导出、导入
    C语言单链表简单实现(简单程序复杂化)
    北邮《大学英语2》第三次阶段作业带答案
    C++走向远洋——30(六周,项目一1.0)
    C++走向远洋——29(长方柱类)
    C++走向远洋——28(项目三,时间类,2)
  • 原文地址:https://www.cnblogs.com/hulang/p/2008213.html
Copyright © 2011-2022 走看看