1.不让DataGridView控件自动生成列

设置AutoGenerateColumns 为false.

dgTicket.AutoGenerateColumns = false; //将自动生成列禁用

2.DataGridView中RowsAdded事件的注意事项

在ASP.NET中的GridView控件在显示绑定数据时有一个RowDataUpdated事件,在其事件响应函数里可以逐行扫描每行所绑定的数据,根据需要可以修改GridView显示的格式或Value等,比较方便。

而在WinForm工程中,与之类似的DataGridView控件,只有RowsAdded事件与之类似,但与GridView不同的是,RowsAdded事件的响应不像RowDataUpdated那样逐条响应,我在Debug很久才发现这个问题,其实只要看到DataGridViewRowsAddedEventArgs e的属性中的RowCount就明白,RowsAdded事件响应时可能插入多行,也可能插入单行(Rows可是复数形式,笨)。故,使用e.RowIndex获取插入行的索引值,e.RowCount获取插入行的数量,使用这两个变量可以方便地遍历所绑定的数据,代码如下所示:

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
int rowIndex = e.RowIndex;
int rowCount = e.RowCount;
for (int i = rowIndex; i < rowIndex + rowCount; i++)
{
//绑定的为List<AccountInfo>数据集,此处获取指定行绑定的数据
AccountInfo info = this.dataGridView1.Rows[i].DataBoundItem as AccountInfo; /////////////////////////////////////////
// 其他数据操作等
///////////////////////////////////////////
}
}

3.与asp.net RowDataBound 等价的事件是CellFormatting 事件

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
//bala bala
}

4.获取DataGridViewCheckBoxCell的选中状态

private void butUpdate_Click(object sender, EventArgs e)
{
bool IsCheck = false;
int count = this.dataGridView1.RowCount;
Merchandise_Info mi = new Merchandise_Info();
for (int i = 0; i < count; i++)
{
//if ((bool)(((DataGridViewCheckBoxCell)this.dataGridView1.Rows[i].Cells[0]).Value) == true)
if ((bool)(((DataGridViewCheckBoxCell)this.dataGridView1.Rows[i].Cells[0]).EditedFormattedValue) == true)
{
mi.Name = this.dataGridView1.Rows[i].Cells["TypeName"].Value.ToString();
IsCheck = true;
MessageBox.Show(this.dataGridView1.Rows[i].Cells["TypeName"].Value.ToString());
} }
if (IsCheck == false)
{
MessageBox.Show("请先选择要修改的行!", "系统提示");
}
}

解释:(DataGridViewCheckBoxCell)this.dataGridView1.Rows[i].Cells[0] //先把行i第0列(行i第0列里放的是CheckBox控件)的转换成DataGridViewCheckBoxCell

(bool)(((DataGridViewCheckBoxCell)this.dataGridView1.Rows[i].Cells[0]).Value) //在转换成bool类型!

最关键的地方是:以下是通过两种方式判断CheckBox的选中状态!

(1)if ((bool)(((DataGridViewCheckBoxCell)this.dataGridView1.Rows[i].Cells[0]).Value) == true)
(2)if ((bool)(((DataGridViewCheckBoxCell)this.dataGridView1.Rows[i].Cells[0]).EditedFormattedValue) == true)

两者的区别是:如果你采用(1)方法,则你必须先给CheckBox控件设初始值(要先把CheckBox的值设为已选或为选或者你要先把CheckBox勾上,总之你要动一下CheckBox或者给他先赋值),否则会出错:“未将对象引用设置到对象的实例。”

如果你采用方法(2)则不用给CheckBox控件设初始值,EditedFormattedValue是获得单元格当前格式化的值,而不考虑当前单元格是否是处于编辑状态,也不论也不论是否尚未提取此值!所以不用给CheckBox控件设初始值。

哈哈!获得是否选中后就可以获得选中行的值了!!

5.设置行高

//设置行高为21px
   this
.dataGridView1.RowTemplate.Height = 21;
  
// 禁止用户改变DataGridView1的所有列的列宽
     DataGridView1.AllowUserToResizeColumns = false;
     //禁止用户改变DataGridView1所有行的行高
     DataGridView1.AllowUserToResizeRows = false;

winform DataGridView控件开发经验的更多相关文章

  1. C#实现WinForm DataGridView控件支持叠加数据绑定

    我们都知道WinForm DataGridView控件支持数据绑定,使用方法很简单,只需将DataSource属性指定到相应的数据源即可,但需注意数据源必须支持IListSource类型,这里说的是支 ...

  2. Winform DataGridView控件添加行号

      有很多种方法,这里介绍三种: A: 控件的RowStateChanged事件中添加,RowStateChanged事件是在行的状态更改(例如,失去或获得输入焦点)时发生的事件: e.Row.Hea ...

  3. 实现winform DataGridView控件判断滚动条是否滚动到当前已加载的数据行底部

    判断 DataGridView控件滚动条是否滚动到当前已加载的数据行底部,其实方法很简单,就是为DataGridView控件添加Scroll事件,然后写入以下代码就可以了,应用范围:可实现分部加载数据 ...

  4. winform DataGridView控件判断滚动条是否滚动到当前已加载的数据行底部 z

    http://www.zuowenjun.cn/post/2015/05/20/162.html 判断 DataGridView控件滚动条是否滚动到当前已加载的数据行底部,其实方法很简单,就是为Dat ...

  5. WinForm DataGridView控件、duck布局

    1.DataGridView控件 显示数据表 (1)后台数据绑定: List<xxx> list = new List<xxx>(); dataGridView1.DataSo ...

  6. Winform DataGridView控件在业务逻辑上的简单使用

    需要对文字列表进行处理,然后用到DataGridView控件来处理,记录一下.效果如下: 主要是想通过禁用和取消单元格选择来使图标单元格呈现出鼠标点击的效果.因为有个单元格选择的问题困扰着我. 是这样 ...

  7. winform datagridview控件使用

    最近做项目时,显示查询结果总需要绑定到datagridview控件上显示,总结了给datagridview绑定数据的方式,以及导出datagridview数据到excel表格,如有错误请多指教 1.直 ...

  8. Winform(DataGridView)控件及通过此控件中实现增删改查

    DataGridView:显示数据表,通过此控件中可以实现连接数据库,实现数据的增删改查 一.后台数据绑定:    List<xxx> list = new List<xxx> ...

  9. 如何在winform DataGridView控件的DataGridViewButtonColumn按钮列中禁用按钮

    原文:http://msdn.microsoft.com/en-us/library/ms171619(v=vs.85).ASPX public class DataGridViewDisableBu ...

随机推荐

  1. 对于javascript的词法作用域的思考

    曾经看到过这样一段有意思的程序: var a=3; function scopeTest(){ console.log(a); var a=2; console.log(a); } scopeTest ...

  2. Codevs 1081 线段树练习2

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master   题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的所有数都增加X 2:询问第 ...

  3. 引入OO开发报表后的感想

    很早就想尝试着在常规的报表开发中 引入OO了 趁着程序略复杂 时间略充裕 终于尝试了一把-咩哈哈~~ 以下来自我的evernote笔记 有点语无伦次-忍忍~~ -------------------- ...

  4. ClickOnce证书签名

    打开Microsoft .NET Framework 的SDK命令提示,按以下步骤操作: 1.创建一个自我签署的X.509证书(.cer)和一个.pvk私钥文件,用到makecert工具,命令如下: ...

  5. nginx自启动脚本

    #!/bin/bash # #Startup script for Nginx - this script starts and stops the nginx daemon # # chkconfi ...

  6. URL锚点HTML定位技术机制

    一.锚点是什么 锚点就等同于火影中的“飞雷神之术”,我们先看百科中锚点的解释: 使用命名锚记可以在文档中设置标记,这些标记通常放在文档的特定主题处或顶部.然后可以创建到这些命名锚记的链接,这些链接可快 ...

  7. Delphi 二次开发 CorelDRAW

    我们首先通过一个简单的程序例子来看一下Delphi对CorelDRAW二次开发有什么样的效果.本程序实现CorelDRAW程序的打开和关闭. 1.1 Delphi与CorelDRAW连接 在程序与Co ...

  8. DataSnap中连接池的应用

    当开发人员开始创建Delphi的DataSnap应用时很常见的数据库连接定义方式是每个数据模块建立一个连接.这样做将产生大量的数据库连接,并产生很多问题.从Delphi XE开始,EMB提供了Sess ...

  9. Freemarker例子

    1.引入架包 2.写ftl文件 3.代码 hello.ftl 你好啊,${hello},今天你的精神不错! if else 语句测试 <#if num gt 18><#-- 不使用 ...

  10. C# 刷票程序

    上个月有人让我帮忙投票,我想要不写个程序给他多刷点得了,虽然这事情有悖原则,就当娱乐了.. 先上图 1.分析 既然是网页投票,那肯定可以伪造HTTP请求来实现刷票.需要分析的就是该网站到底采用了哪些防 ...