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个表,也一样可以绑定多个表

  • 相关阅读:
    【算法学习笔记】27.动态规划 解题报告 SJTU OJ 1254 传手绢
    【算法学习笔记】26.扫描维护法 解题报告 SJTU OJ 1133 数星星
    【算法学习笔记】25.贪心法 均分纸牌问题的分析
    【算法学习笔记】24.记忆化搜索 解题报告 SJTU OJ 1002 二哥种花生
    【算法学习笔记】23.动态规划 解题报告 SJTU OJ 1280 整装待发
    【算法学习笔记】22.算法设计初步 二分查找 上下界判断
    【算法学习笔记】21.算法设计初步 求第k个数 划分法 快排法
    【算法学习笔记】20.算法设计初步 归并排序 求逆序数
    【算法学习笔记】19.算法设计初步 最大子列和问题的几种方法
    【算法学习笔记】18.暴力求解法06 隐式图搜索2 八数码问题 未启发
  • 原文地址:https://www.cnblogs.com/hulang/p/2008213.html
Copyright © 2011-2022 走看看