winform DataGridView控件开发经验
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控件开发经验的更多相关文章
- C#实现WinForm DataGridView控件支持叠加数据绑定
我们都知道WinForm DataGridView控件支持数据绑定,使用方法很简单,只需将DataSource属性指定到相应的数据源即可,但需注意数据源必须支持IListSource类型,这里说的是支 ...
- Winform DataGridView控件添加行号
有很多种方法,这里介绍三种: A: 控件的RowStateChanged事件中添加,RowStateChanged事件是在行的状态更改(例如,失去或获得输入焦点)时发生的事件: e.Row.Hea ...
- 实现winform DataGridView控件判断滚动条是否滚动到当前已加载的数据行底部
判断 DataGridView控件滚动条是否滚动到当前已加载的数据行底部,其实方法很简单,就是为DataGridView控件添加Scroll事件,然后写入以下代码就可以了,应用范围:可实现分部加载数据 ...
- winform DataGridView控件判断滚动条是否滚动到当前已加载的数据行底部 z
http://www.zuowenjun.cn/post/2015/05/20/162.html 判断 DataGridView控件滚动条是否滚动到当前已加载的数据行底部,其实方法很简单,就是为Dat ...
- WinForm DataGridView控件、duck布局
1.DataGridView控件 显示数据表 (1)后台数据绑定: List<xxx> list = new List<xxx>(); dataGridView1.DataSo ...
- Winform DataGridView控件在业务逻辑上的简单使用
需要对文字列表进行处理,然后用到DataGridView控件来处理,记录一下.效果如下: 主要是想通过禁用和取消单元格选择来使图标单元格呈现出鼠标点击的效果.因为有个单元格选择的问题困扰着我. 是这样 ...
- winform datagridview控件使用
最近做项目时,显示查询结果总需要绑定到datagridview控件上显示,总结了给datagridview绑定数据的方式,以及导出datagridview数据到excel表格,如有错误请多指教 1.直 ...
- Winform(DataGridView)控件及通过此控件中实现增删改查
DataGridView:显示数据表,通过此控件中可以实现连接数据库,实现数据的增删改查 一.后台数据绑定: List<xxx> list = new List<xxx> ...
- 如何在winform DataGridView控件的DataGridViewButtonColumn按钮列中禁用按钮
原文:http://msdn.microsoft.com/en-us/library/ms171619(v=vs.85).ASPX public class DataGridViewDisableBu ...
随机推荐
- arcgis js api 本地化配置
配置arcgis library 根目录的init.js的 "baseUrl:",使其指向正确的地址
- ionic中的生命周期函数
//ionic中的生命周期函数 onPageLoaded(){ //page初始化时 console.log("page 1 : page loaded"); } //在这里可以做 ...
- Azure + vsftpd + ubntu14 + 虚拟用户 遇到的问题:从网上摘抄
:在Azure安装好ubuntu虚拟机,安装包选择ubuntu14.04 LTS,选择LTS,以便微软对其以后的更好支持,不选就可能技术支持不会很久,现只开一台,端口默认选择22 :打开虚拟机,进入端 ...
- lnmp下配置虚拟主机
一:首先熟悉几个命令 which php ---> which是通过 PATH环境变量到该路径内查找可执行文件,所以基本的功能是寻找可执行文件 whereis php ----& ...
- Centos文本方式安装情况下lvm分区的创建
作者:马 岩(Furzoom) (http://www.cnblogs.com/furzoom/)版权声明:本文的版权归作者与博客园共同所有.转载时请在明显地方注明本文的详细链接,未经作者同意请不要删 ...
- php中url传递中文字符,特殊危险字符的解决方法
php中的urldecode,base64_encode函数然后再结合自己写的替换函数来进行安全传递url中文字符,特殊危险字符. 需要在url中传递中文字符或是其它的html等特殊字符,似乎总会有各 ...
- 《零成本实现Web自动化测试--基于Selenium》 第四章 Selenium 命令
Selenium 命令,通常被称为Selenese,由一系列运行测试案例所需要的命令构成.按顺序排列这些命令就构成了测试脚本. 一. 验证颜面元素 1.Assertion或者Verification ...
- 谈网页游戏外挂之用python模拟游戏(热血三国2)登陆
看web看多了,想写写页游的外挂,其实原理是一样的,就是端口不一样协议字段你不知道,而这也提高了点技术门槛,看我们来一点一点突破这些门槛,这次我们来用python发包模拟flash的客户端登陆. 以热 ...
- cadence PCB绘制步骤
1 创建一个PCB文件 file -> new 2 创建一个板框 add -> line ,在 options 选型中选择好,板框为 长 4400mil 宽 3200 3 给PCB板框 ...
- c++内存分配
[导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...