当前位置: 首页 > news >正文

DataGridView使用初步

(1)数据绑定

首先编辑Columns属性,设置要绑定的列。然后定义如下的成员变量:

 string connstr = @"server=.\sqlexpress;initial catalog=MySchool;uid=sa;pwd=123456";
DataSet ds = new DataSet();
SqlDataAdapter da;

编写数据绑定方法LoadData()

        private void LoadData()
        {
            string strwhere;
            if (comboBox1.Text == "男")
                strwhere="sex='男'";
            else
                if (comboBox1.Text == "女")
                    strwhere="sex='女'";
                else
                    strwhere="sex='男' or sex='女'";
            //using (SqlConnection conn = new SqlConnection(connstr))
            {
                string sql = "select StudentId,StudentNo,StudentName,Sex from Student where " + strwhere;
                da = new SqlDataAdapter(sql, connstr);
                ds.Tables.Clear();
                da.Fill(ds);
                dataGridView1.DataSource = ds.Tables[0];

            }
            int rowNumber = 1;
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                row.HeaderCell.Value = rowNumber.ToString();
                rowNumber++;
            }
        }

在窗体加载事件中调用LoadData()方法:

        private void StudentListForm_Load(object sender, EventArgs e)
        {
            LoadData();
        }

(2)更新DataGridView中的数据,当用户修改数据后,点击“保存修改”按钮,更新数据。代码如下:

           SqlCommandBuilder cmdb = new SqlCommandBuilder(da);
            da.Update(ds);
            LoadData();  //重新绑定数据

(3)为DataGridView添加右键菜单,供用户删除整行数据。先设置DataGridView的SelectionMode属性为FullRowSelect,然后编写代码:

       private void 删除ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (dataGridView1.SelectedRows.Count== 0)
            {
                MessageBox.Show("请选择!");
                return;
            }
            if (MessageBox.Show("确认要删除吗?", "警告", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
            {
                using (SqlConnection conn = new SqlConnection(connstr))
                {
                    string sql = "delete from Student where StudentId=" + (int)dataGridView1.SelectedRows[0].Cells[0].Value;
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    conn.Open();
                    cmd.ExecuteNonQuery();
                }
                LoadData();      //重新绑定数据
             }
        }
 

(4) 要显示SqlCommandBuilder自动构造的语句,可以用下面的代码:

            SqlCommandBuilder cmdb = new SqlCommandBuilder(dp);
            MessageBox.Show(cmdb.GetDeleteCommand().CommandText);  
            MessageBox.Show(cmdb.GetInsertCommand().CommandText);
            MessageBox.Show(cmdb.GetUpdateCommand().CommandText);
            MessageBox.Show(dp.SelectCommand.CommandText);

(5)也可以自己构造InsertCommand、UpdateCommand、DeleteCommand命令,代码如下:

           string sqlconn = @"server=.\sqlexpress;database=student;uid=sa;pwd=sa";
            DataSet ds = new DataSet();
            SqlConnection conn = new SqlConnection(sqlconn);
            SqlDataAdapter dp=new SqlDataAdapter("select * from student",conn);
            dp.Fill(ds,"student");
            DataRow r=ds.Tables["student"].NewRow();
            r["studentid"]="09888888";
            r["studentname"]="test";
            ds.Tables["student"].Rows.Add(r);
            SqlCommand insertCmd = new SqlCommand("insert into student(studentid,studentname) values(@studentid,@studentname)", conn);
            insertCmd.Parameters.Add("@studentid", SqlDbType.VarChar, 8,"studentid");
            insertCmd.Parameters.Add("@studentname", SqlDbType.NVarChar, 50,"studentname");
            dp.InsertCommand = insertCmd;
            dp.Update(ds.Tables[0]);

           如果除了插入,还有更新、删除,则需要同时构造对应的UpdateCommand、DeleteCommand命令,否则会出错。

所以,用SqlCommandBuilder代码比较简洁,但灵活性较差。

(6)DataGridView.CellStateChanged事件作用

    在单元格的状态更改时(例如,当单元格失去或获得焦点时)发生。 要触发该事件,SelectionMode属性不能用FullRowSelect,要用CellSelect.
(7)DataGridView.CellValueChanged事件作用

 CellValueChanged事件在单元格的值改变,并且是在焦点离开单元格时发生。用代码绑定数据时,也会触发该事件!

(8)DataGridView控件在最左边列显示序号
///简单的方法:
绑定数据后,用下面的代码
int rowNumber = 1;
 foreach (DataGridViewRow row in dataGridView1.Rows)
{
        row.HeaderCell.Value = rowNumber.ToString();
        rowNumber++;

}
但序号是2位数的话,显示不清楚,列宽不够。要修改DataGridView控件的RowHeadersWidth属性。
第2种方法,能让箭头都不显示
       private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            Rectangle rowHeaderBounds = new Rectangle
           (
                2, e.RowBounds.Top,
                this.dataGridView1.RowHeadersWidth - 2, e.RowBounds.Height - 1
           );

            using (Brush backbrush =
                new SolidBrush(SystemColors.Control))
            {
                e.Graphics.FillRectangle(backbrush, rowHeaderBounds);
            }

            if (e.RowIndex >= dataGridView1.FirstDisplayedScrollingRowIndex)
            {
                using (SolidBrush b = new SolidBrush(dataGridView1.RowHeadersDefaultCellStyle.ForeColor))
                {
                    int linen = 0;
                    linen = e.RowIndex + 1;
                    string line = linen.ToString();
                    e.Graphics.DrawString(line, e.InheritedRowStyle.Font, b, e.RowBounds.Location.X, e.RowBounds.Location.Y + 5);
                    SolidBrush B = new SolidBrush(Color.Red);
                }
            }

        }
   }

(9)取消自动生成列

    dataGridView1.AutoGenerateColumns = false;

在Visual Studio 2013中,DataGridView控件的属性窗口中没有AutoGenerateColumns属性,故只能通过代码来设置这个属性。

相关文章:

  • 链式前向星
  • 只在UnitTest和WebHost中的出现的关于LogicalCallContext的严重问题
  • SQL Server 2008使用LINQ进行数据访问(转载自IT168 [ http://www.it168.com/ ])
  • Windows中运行Python的两种运行方式
  • GNS3使用详解2
  • 数据类型测试及转换案例
  • VS2010编译Web项目要用 batch=false
  • 《WCF技术剖析》博文系列汇总[持续更新中]
  • 在linux中怎样用命令完全拷贝一个目录下的所有文件(包括隐藏文件以及文件夹)到另外一个目录下...
  • 传输层TCP
  • 模态对话框和非模态对话框的消息循环
  • 定制rpm包-Yum环境搭建
  • Visual.Studio.2010.简体中文旗舰版内置KEY
  • 高性能朋友圈
  • C# wnform 请求http ( get , post 两种方式 )
  • 【译】理解JavaScript:new 关键字
  • Create React App 使用
  • ECMAScript入门(七)--Module语法
  • HTML5新特性总结
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • leetcode讲解--894. All Possible Full Binary Trees
  • node和express搭建代理服务器(源码)
  • underscore源码剖析之整体架构
  • 从setTimeout-setInterval看JS线程
  • 给github项目添加CI badge
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • ​油烟净化器电源安全,保障健康餐饮生活
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (三)mysql_MYSQL(三)
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • ****Linux下Mysql的安装和配置
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET关于 跳过SSL中遇到的问题
  • ?
  • @ComponentScan比较
  • [ C++ ] STL---stack与queue
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • [AIGC] Java 和 Kotlin 的区别
  • [ComfyUI进阶教程] animatediff视频提示词书写要点
  • [HTTP]HTTP协议的状态码
  • [IE9] IE9 beta版下载链接
  • [Intel Edison开发板] 05、Edison开发基于MRAA实现IO控制,特别是UART通信
  • [noip2015 d1t2] 信息传递
  • [pdf]《软件方法》强化自测题业务建模需求分析共191页,230题
  • [Python学习]总结一下Cygwin安装与进阶学习列表