DataGridView的用法
- 格式:doc
- 大小:104.50 KB
- 文档页数:8
datagridview技巧DataGridView是Windows Forms中常用的控件之一,可以在应用程序中展示和编辑表格数据。
下面介绍一些DataGridView的技巧。
1. 在DataGridView中添加数据:可以通过代码动态添加数据,也可以将数据源绑定到DataGridView上。
使用DataSource属性可以绑定数据源,也可以手动遍历数据,使用Rows和Cells属性来添加数据。
2. 设置列样式:可以通过DataGridView的Column属性设置列的样式和属性,如宽度、标题文本、数据类型等。
还可以通过DefaultCellStyle属性设置列的默认单元格样式。
3. 单元格格式和数据验证:可以通过CellFormatting事件来自定义单元格的显示格式,如日期格式、货币格式等。
还可以通过CellValidating事件来验证用户输入的数据,并给出提示。
4. 排序和筛选:可以通过Sort方法对DataGridView中的数据进行排序。
还可以使用AutoFilter属性启用或禁用列标题的自动筛选功能,方便用户筛选数据。
5. 选择和编辑:可以通过SelectionMode属性设置选择模式,如单选、多选等。
还可以通过ReadOnly属性设置是否允许用户编辑单元格。
另外,还可以通过SelectedCells和SelectedRows属性获取用户选择的单元格或行。
6. 自定义单元格和行样式:可以通过CellPainting和RowPostPaint事件来自定义单元格和行的样式,如背景色、字体等。
可以根据特定的条件来改变单元格或行的样式,以提升用户体验。
7. 导出数据:可以通过DataGridView的GetClipboardContent方法将DataGridView中的数据导出为文本或HTML格式,方便数据的导出和共享。
以上是一些常用的DataGridView技巧,希望对您有帮助。
DataGridView用法1.概述D a ta Gr id Vi ew是Wi n do ws Fo rm s中一种常用的控件,用于展示和编辑表格数据。
本文将介绍Da ta Gr id Vi ew的基本用法和常用功能。
2.基本用法2.1创建D a t a G r i d V i e w要使用D at aG ri dVi e w,首先需要在窗体上进行控件的创建和初始化。
可以通过拖拽控件到窗体上或者在代码中动态创建控件。
2.2数据绑定在D at aG ri dV ie w中展示数据通常需要进行数据绑定。
可以通过设置D a ta So ur ce属性来实现数据绑定,可以绑定Da ta Ta bl e、B i nd in gS ou rc e等数据源。
2.3列定义可以通过列定义来指定D at aG ri dV ie w中的列数、列名、列类型等属性。
可以使用Da ta Gr i dV ie w的Co lu mns集合来对列进行操作。
2.4行操作可以通过Da ta Gr idV i ew的R ow s集合对行进行操作,如添加、删除、插入等操作。
可以根据行索引或行对象进行操作。
3.常用功能3.1样式设置可以通过设置Da ta Gr i dV ie w的Ce ll Sty l e、C o lu mn He ad er De fau l tC el lS ty le、R ow H ea de rs De fa ul tCe l lS ty le等属性来设置样式,如背景色、字体、对齐方式等。
3.2单元格编辑D a ta Gr id Vi ew可以方便地对单元格进行编辑,可以根据需要设置单元格的可编辑性,只读属性等。
可以通过事件处理程序来实现特定单元格的编辑操作。
3.3排序和筛选D a ta Gr id Vi ew提供了对数据进行排序和筛选的功能。
可以通过设置A l lo wS or ti ng属性来启用排序功能,通过设置A l lo wU se rT oF il ter C ol um ns属性来启用筛选功能。
DataGridView控件用法合集目录DataGridView控件用法合集(一)1. DataGridView当前的单元格属性取得、变更2. DataGridView编辑属性3. DataGridView最下面一列新追加行非表示4. DataGridView判断当前选中行是否为新追加的行5. DataGridView删除行可否设定6. DataGridView行列不表示和删除DataGridView控件用法合集(二)7. DataGridView行列宽度高度设置为不能编辑8. DataGridView行高列幅自动调整9. DataGridView指定行列冻结10. DataGridView列顺序变更可否设定11. DataGridView行复数选择12. DataGridView选择的行、列、单元格取得DataGridView控件用法合集(三)13. DataGridView指定单元格是否表示14. DataGridView表头部单元格取得15. DataGridView表头部单元格文字列设定16. DataGridView选择的部分拷贝至剪贴板17.DataGridView粘贴18. DataGridView单元格上ToolTip表示设定(鼠标移动到相应单元格上时,弹出说明信息) DataGridView控件用法合集(四)19. DataGridView中的ContextMenuStrip属性20. DataGridView指定滚动框位置21. DataGridView手动追加列22. DataGridView全体分界线样式设置23. DataGridView根据单元格属性更改显示内容24. DataGridView新追加行的行高样式设置る25. DataGridView新追加行单元格默认值设置DataGridView中输入错误数据的处理(五)26. DataGridView单元格数据错误标签表示27. DataGridView单元格内输入值正确性判断28. DataGridView单元格输入错误值事件的捕获DataGridView控件用法合集(六)29. DataGridView行排序(点击列表头自动排序的设置)30. DataGridView自动行排序(新追加值也会自动排序)31. DataGridView自动行排序禁止情况下的排序32. DataGridView指定列指定排序DataGridView控件用法合集(七)33. DataGridView单元格样式设置34. DataGridView文字表示位置的设定35. DataGridView单元格内文字列换行36. DataGridView单元格DBNull值表示的设定37. DataGridView单元格样式格式化38. DataGridView指定单元格颜色设定39. DataGridView单元格文字字体设置40. DataGridView根据单元格值设定单元格样式DataGridView控件用法合集(八)41. DataGridView设置单元格背景颜色42. DataGridView行样式描画43. DataGridView显示行号44. DataGridView焦点所在单元格焦点框不显示的设定DataGridView控件用法合集(九)45. DataGridView中显示选择框CheckBox46. DataGridView中显示下拉框ComboBox47. DataGridView单击打开下拉框48. DataGridView中显示按钮49. DataGridView中显示链接50. DataGridView中显示图像DataGridView控件用法合集(十)51. DataGridView编辑中单元格控件取得52. DataGridView输入自动完成53. DataGridView单元格编辑时键盘KEY事件取得54. DataGridView下拉框(ComboBox)单元格编辑时事件取得55. DataGridView下拉框(ComboBox)单元格允许文字输入设定DataGridView控件用法合集(十一)56. DataGridView根据值不同在另一列中显示相应图片57. DataGridView中显示进度条(ProgressBar)58. DataGridView中添加MaskedTextBoxDataGridView控件用法合集(十二)59. DataGridView中Enter键按下焦点移至旁边的单元格60. DataGridView行集合化(Group)正文DataGridView控件用法合集(一)1. DataGridView当前的单元格属性取得、变更2. DataGridView编辑属性3. DataGridView最下面一列新追加行非表示4. DataGridView判断当前选中行是否为新追加的行5. DataGridView删除行可否设定6. DataGridView行列不表示和删除1.当前的单元格属性取得、变更[]'当前选中单元的值Console.WriteLine(DataGridView1.CurrentCell.Value)'当前列的Index值Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex)'当前单元的行Index值Console.WriteLine(DataGridView1.CurrentCell.RowIndex)'将控件中(0, 0)处的值,赋给当前单元格.DataGridView1.CurrentCell = DataGridView1(0, 0)2.DataGridView编辑属性全部单元格编辑属性[]'DataGridView1只读属性DataGridView1.ReadOnly = True指定行列单元格编辑属性[]DataGridView1.Columns(1).ReadOnly = TrueDataGridView1.Rows(2).ReadOnly = TrueDataGridView1(0, 0).ReadOnly = True根据条件判断单元格的编辑属性下例中column2的值是True的时候,Column1设为可编辑[]Private Sub DataGridView1_CellBeginEdit(ByVal sender As Object, _ByVal e As DataGridViewCellCancelEventArgs) _Handles DataGridView1.CellBeginEditDim dgv As DataGridView = CType(sender, DataGridView)If dgv.Columns(e.ColumnIndex).Name = "Column1" AndAlso _Not CBool(dgv("Column2", e.RowIndex).Value) Thene.Cancel = TrueEnd IfEnd Sub3.DataGridView最下面一列新追加行非表示[]DataGridView1.AllowUserToAddRows = False4.判断当前选中行是否为新追加的行[]If DataGridView1.CurrentRow.IsNewRow ThenConsole.WriteLine("現在のセルがある行は、新しい行です。
DATAGRIDVIEW属性及方法属性:1. AllowUserToAddRows:获取或设置一个值,指示是否允许用户添加新行。
2. AllowUserToDeleteRows:获取或设置一个值,指示是否允许用户删除行。
3. AllowUserToResizeColumns:获取或设置一个值,指示是否允许用户调整列的大小。
4. AllowUserToResizeRows:获取或设置一个值,指示是否允许用户调整行的大小。
5. AutoSizeColumnsMode:获取或设置值,指示列宽度的调整模式。
6. DataSource:获取或设置与该DataGridView关联的数据源。
7. RowHeadersVisible:获取或设置一个值,指示是否显示行标题。
8. ColumnHeadersVisible:获取或设置一个值,指示是否显示列标题。
9. ReadOnly:获取或设置一个值,指示是否只读。
10. MultiSelect:获取或设置一个值,指示是否可以同时选择多个单元格。
方法:1. ClearSelection(:取消选择所有选定的单元格。
2. Refresh(:重新绘制DataGridView控件。
3. Sort(DataGridViewColumn, ListSortDirection):按指定的列和排序顺序对表格进行排序。
4. SelectAll(:选择所有单元格。
5. Clear(:清除掉DataGridView控件中的所有数据。
7. ClearSelection(:清除当前选定的单元格的选择。
除了上述属性和方法外,DataGridView还有一些事件,可以让我们在特定的情况下作出响应。
例如,CellClick事件在单击单元格时触发,可以用来获取当前选中的单元格的值。
另外,DataGridView还有许多其他的属性和方法,用于设置和操作表格的样式、行高、列宽等。
总结起来,DataGridView是Windows Forms中非常常用的表格控件,具有丰富的属性和方法,用于设置和操作表格的外观和行为。
DataGridView的使⽤总结⼀、属性应⽤1.设置单元格⿏标点击后就进⼊编辑状态设置DataGridView控件的EditMode这个属性,即EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter这样当⿏标点击单元格时就会变成编辑状态。
2.设置DataGridView控件的⾏选择样式设置DataGridView控件的SelectionMode这个属性,即SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect这样我们再选中的时候就是以⾏的形式选中的。
3.当⽤户点击列标题时不进⾏排序在默认情况下,当⽤户点击DataGridView控件的列标题时会⾃动对内容进⾏排序,现在我们禁⽌它进⾏排序,通过设置每⼀列的SortMode这个属性来实现,即SortMode=NotSortable这样当我们点击列标题时就不会⾃动进⾏排序了。
4.去除DataGridView⾃带的⼀⾏(带有*号的那⼀⾏,或者是不允许⽤户添加数据)DataGridView控件在默认的情况下会⾃动的绑上⼀⾏空数据,这⼀⾏空数据可以使⽤户进⾏数据添加,现在我们想去除这⼀列,通过设置属性AllowUserToAddRows=false;这样在绑定的时候就不会再显⽰这⼀⾏了。
5.设置单元格不可编辑⽅法⼀:我们可以在控件完成数据绑定后在对DataGridView控件进⾏遍历,根据条件设置单元格的readonly 属性,使此单元格不能进⾏编辑。
如下:/// <summary>/// 更新数据/// </summary>public void UpdateData(){//获取数据源dgvliucycx.DataSource =bll_liucy.GetAllList().Tables[0].DefaultView;//改变废弃项的背景颜⾊ChangeColor();//设置修改时间和修改⼈列为只读的BandColumn();/// 改变DataGridView控件废弃项的背景颜⾊/// </summary>public void ChangeColor(){//将已废弃的样品记录背景⾊表⽰为蓝⾊try{for (int i = 0; i < dgvliucycx.Rows.Count; i++){if(Convert.ToString(dgvliucycx.Rows[i].Cells["BIAOS"].Value) == "废弃"){dgvliucycx.Rows[i].DefaultCellStyle.BackColor = Color.Aqua;}}}catch (Exception ex){KryptonMessageBox.Show(ex.ToString());}}/// <summary>绑定修改⼈和修改时间这⼀列,进攻参考设定修改⼈和修改⽇期、标识为只读的⽅法⼆:我们还可以在CellBeginEdit事件中进⾏判断是否对单元格进⾏编辑,如下:// CellBeginEdit 事件处理⽅法private void DataGridView1_CellBeginEdit(objectsender,DataGridViewCellCancelEventArgs e){DataGridView dgv = (DataGridView)sender;//是否可以进⾏编辑的条件检查if (dgv.Columns[e.ColumnIndex].Name =="Column1" &&!(bool)dgv["Column2", e.RowIndex].Value){// 取消编辑e.Cancel = true;}}6.DataGridView判断新增⾏DataGridView的AllowUserToAddRows属性为True时也就是允许⽤户追加新⾏的场合下, DataGridView的最后⼀⾏就是新追加的⾏(*⾏)。
dataGridView的用法dataGridView的几个基本操作:1、获得某个(指定的)单元格的值:dataGridView1.Row[i].Cells[j].Value;2、获得选中的总行数:dataGridView1.SelectedRows.Count;3、获得当前选中行的索引:dataGridView1.CurrentRow.Index;4、获得当前选中单元格的值:dataGridView1.CurrentCell.Value;5、取选中行的数据string[] str = new string[dataGridView.Rows.Count];for(int i;i<datagridview1.rows.count;i++)< bdsfid="75" p=""></datagridview1.rows.count;i++)<>{if(dataGridView1.Rows[i].Selected == true){str[i] = dataGridView1.Rows[i].Cells[1].Value.ToString();}}7、获取选中行的某个数据int a = dataGridView1.SelectedRows.Index;dataGridView1.Rows[a].Cells["你想要的某一列的索引,想要几就写几"].Value;int a=dataGridView1.CurrentRow.Index;stringstr=dataGridView1.Row[a].Cells["strName"].Value.T ostring();DataRowState rowState=new DataRowState ();DataTable dt=(DataTable)this.dgvStudentInfo .DataSource ;for (int i = 0; i < dt.Rows.Count; i++){//rowState == DataRowState.Added || rowState == DataRowState.Detached ||if (rowState == DataRowState.Modified){//dt.Rows[i].Delete();//dt.ImportRow(dt.Rows[i]);//dgvStudentInfo.DataSource = dt;//dgvStudentInfo.Refresh();bllStudent.Update(stuModel);}}选中行的某个数据//string stuid = dgvStuInfo.Rows[0].Cells[0].Value.T oString();//int id = this.dgvStuInfo.CurrentRow.Cells[0].RowIndex;//string stuid = this.dgvStuInfo.Rows[id].Cells[0].Value.ToString();。
DataGridView控件⽤法(⼀)绑定数据⼀、DataGridView控件的⽤法(如何绑定、修改其中某⼀列值、添加序号列、交换任意2列显⽰顺序)1. DataGridView绑定数据源。
在页⾯上拖放⼀个DataGridView控件//连接数据库读取数据,为DataGridView赋值。
String strConn = "server= .\XWPC_DATABASE;uid=数据库⽤户名;pwd=数据库密码;database=数据库名";SqlConnection conn = new SqlConnection(strConn);String sqlId = "select * from [USER] ";conn.Open();SqlCommand cmd = new SqlCommand(sqlId, conn);SqlDataAdapter da = new SqlDataAdapter(cmd);DataSet ds = new DataSet();da.Fill(ds, "USER");DataGridView.DataSource = ds;DataGridView.DataMember = "USER";conn.Close();上述代码执⾏后页⾯上数据显⽰是这样的:2. 修改 DataGridView中数据的表头(本来默认是数据库中的字段名)。
//改变DataGridView的表头DataGridView.Columns[1].HeaderText = "⽤户名";//设置该列宽度DataGridView.Columns[1].Width = 70;3. 将DataGridView最前⾯⼀列编号改为从1开始依次增加的序号(默认的字段编号对⽤户没意义,⽽且不连续)。
//在表前⾯加⼀列表⽰序号DataGridView.Columns[0].HeaderText = "编号";DataGridView.Columns[0].Width = 60;//⾃动整理序列号int coun = DataGridView.RowCount;for (int i = 0; i < coun - 1; i++){DataGridView.Rows[i].Cells[0].Value = i + 1;DataGridView.Rows[i].Cells["USER_ID"].Value = i + 1;}//改变DataGridView的表头DataGridView.Columns[1].HeaderText = "⽤户名";//设置该列宽度DataGridView.Columns[1].Width = 70;DataGridView.Columns[2].HeaderText = "密码";DataGridView.Columns[2].Width = 70;//默认按顺序每列DataGridView依次从ds中对应赋值DataGridView.Columns[0].DataPropertyName = ds.Tables[0].Columns[0].ToString();执⾏后效果如下:4. 对调 DataGridView中某两列的顺序,代码如下: //改变DataGridView的表头DataGridView.Columns[1].HeaderText = "密码";//设置该列宽度DataGridView.Columns[1].Width = 70;DataGridView.Columns[1].DataPropertyName =ds.Tables[0].Columns[2].ToString();DataGridView.Columns[2].HeaderText = "⽤户名";DataGridView.Columns[2].Width =70;DataGridView.Columns[2].DataPropertyName = ds.Tables[0].Columns[1].ToString(); 执⾏效果:5. 设置DataGridView使某列不显⽰、使其不可直接编辑、使其不显⽰最后⼀⾏空⽩。
datagridview控件用法
1、将datagridview控件添加到From:添加DataGridView控件,双击界面上的DataGridView,根据实际情况在设计界面里调整控件大小,在属性框中设置DataGridView的数据源(DataSource)的值。
2、定义控件的列:右键DataGridView,选择“属性”,然后在弹出的对话框中,将“列集合”条目选中,点击“...”,此时可以定义你想要的列,设置列名、数据类型、宽度等信息。
3、绑定数据源:当定义好DataGridView的列后,为了显示该出来的具体的数据,可以将DataGridView与真实的数据源绑定,即可在DataGridView中显示具体数据,可以在设计时通过Visual Studio的Data Sources应用程序,或者在窗体上加载DataGridView控件时,通过代码来实现。
4、DataGridView添加行或者删除行:可以使用DataGridView的Rows属性来添加新行,或者通过使用RemoveAt(int index)方法来删除列中指定行。
5、DataGridView编辑功能及事件:默认情况下DataGridView中支持修改单元格数据,可以设置DataGridView的ReadOnly属性为false使其允许进行修改,并且DataGridView中TextBox派生的控件中的CellValidating事件、
CellValueChanged事件等都可以响应DataGridView的编辑功能,可以在这些事件中实现对数据的监测或者保存数据的操作。
DataGridView 行、列的隐藏和删除概述在开发Windows应用程序时,我们经常会使用DataGridView控件来展示和编辑数据。
DataGridView是一个强大的控件,它允许用户在表格中查看和修改数据。
这篇文档将介绍如何在DataGridView中隐藏和删除行、列。
隐藏行和列隐藏行要隐藏DataGridView中的行,可以使用Visible属性。
默认情况下,所有的行都是可见的,将Visible属性设置为false可以隐藏特定的行。
dataGridView.Rows[index].Visible = false;上述代码将隐藏指定的行,其中index是要隐藏的行的索引。
要隐藏DataGridView中的列,可以使用Visible属性。
默认情况下,所有的列都是可见的,将Visible属性设置为false可以隐藏特定的列。
dataGridView.Columns[index].Visible = false;上述代码将隐藏指定的列,其中index是要隐藏的列的索引。
删除行和列删除行要删除DataGridView中的行,可以使用RemoveAt方法。
该方法将从DataGridView的行集合中删除指定索引的行。
dataGridView.Rows.RemoveAt(index);上述代码将删除指定索引的行,其中index是要删除的行的索引。
要删除DataGridView中的列,可以使用RemoveAt方法。
该方法将从DataGridView的列集合中删除指定索引的列。
dataGridView.Columns.RemoveAt(index);上述代码将删除指定索引的列,其中index是要删除的列的索引。
示例下面的示例演示了如何在DataGridView中隐藏和删除行、列。
// 隐藏行dataGridView.Rows[0].Visible = false;// 隐藏列dataGridView.Columns[1].Visible = false;// 删除行dataGridView.Rows.RemoveAt(2);// 删除列dataGridView.Columns.RemoveAt(3);上述代码将隐藏第一行、第二列,并删除第三行和第四列。
datagridview 用法DataGridView是Windows Forms中的控件,是一种可以显示数据的表格控件。
常用的DataGridView属性和方法:1. 属性:DataSource:设置或获取数据源。
2. 属性:AutoGenerateColumns:设置或获取是否自动生成列。
3. 属性:RowHeadersVisible:设置或获取是否显示行标题。
4. 方法:Refresh:刷新DataGridView控件的显示。
常用的DataGridView事件:1. 事件:RowValidating:当行数据验证时发生。
2. 事件:CellClick:单击单元格时发生。
3. 事件:CellDoubleClick:双击单元格时发生。
4. 事件:SelectionChanged:当选择项发生更改时发生。
DataGridView的使用步骤:1. 创建DataGridView实例。
2. 设置DataSource属性。
3. 可选设置AutoGenerateColumns属性。
4. 可选设置RowHeadersVisible属性及其他属性。
5. 注册事件处理程序。
6. 添加DataGridView到窗体中。
下面是一个简单示例代码:C#代码:csharpdataGridView1.DataSource = dataTable; dataTable为绑定数据源dataGridView1.AutoGenerateColumns = true;dataGridView1.RowHeadersVisible = false;dataGridView1.CellClick += DataGridView_CellClick;注:DataGridView_CellClick是事件处理程序的方法名,需要自行定义。
在C# WinForm下做过项目的朋友都知道,其中的DataGridView控件默认只支持DataGridViewButtonColumn、DataGridViewCheckBoxColumn、DataGridViewComboBoxColumn、DataGridViewImageColumn、DataGridViewLinkColumn和DataGridViewTextBoxColumn六种列类型,如果你想要在DataGridView的列中添加其它的子控件,则需要自己实现DataGridViewColumn和DataGridViewCell,这就意味着你需要从现有的列中继承并改写一些方法,如实现一个支持单选按钮的列,或支持三种选择状态的多选按钮的列。
上面两个截图分别为RadioButton列和支持三种状态的CheckBox列在DataGridView中的实现效果,我是在Windows 2003中实现的,因此显示的效果跟在XP和Vista下有些区别,Vista下CheckBox的第三种状态(不确定状态)显示出来的效果是一个实心的蓝色方块。
下面我看具体来看看如何实现这两种效果。
要实现自定义的DataGridView列,你需要继承并改写两个类,一个是基于DataGridViewColumn的,一个是基于DataGridViewCell的,因为RadionButton和CheckBox的实现原理类似,因此我们可以将这两种列采用同一种方法实现。
创建DataGridViewDisableCheckBoxCell和DataGridViewDisableCheckBoxColumn两个类,分别继承自DataGridViewCheckBoxCell和DataGridViewCheckBoxColumn。
代码如下:public class DataGridViewDisableCheckBoxCell: DataGridViewCheckBoxCell {public bool Enabled { get; set; }// Override the Clone method so that the Enabled property is copied.public override object Clone(){DataGridViewDisableCheckBoxCell cell = (DataGridViewDisableCheckBoxCell)base.Clone();cell.Enabled = this.Enabled;return cell;}// By default, enable the CheckBox cell.public DataGridViewDisableCheckBoxCell(){this.Enabled = true;}// Three state checkbox column cellprotected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex,DataGridViewElementStates elementState, object value, object formattedValue, string errorText,DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts){// The checkBox cell is disabled, so paint the border, background, and disabled checkBox for the cell.if (!this.Enabled){// Draw the cell background, if specified.if ((paintParts &DataGridViewPaintParts.Background) ==DataGridViewPaintParts.Background){SolidBrush cellBackground = new SolidBrush(cellStyle.BackColor);graphics.FillRectangle(cellBackground,cellBounds);cellBackground.Dispose();}// Draw the cell borders, if specified.if ((paintParts & DataGridViewPaintParts.Border) == DataGridViewPaintParts.Border){PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle);}// Calculate the area in which to draw the checkBox.CheckBoxState state =CheckBoxState.MixedDisabled;Size size =CheckBoxRenderer.GetGlyphSize(graphics, state);Point center = new Point(cellBounds.X, cellBounds.Y);center.X += (cellBounds.Width - size.Width) / 2;center.Y += (cellBounds.Height - size.Height) / 2;// Draw the disabled checkBox.CheckBoxRenderer.DrawCheckBox(graphics, center, state);}else{// The checkBox cell is enabled, so let the base class, handle the painting.base.Paint(graphics, clipBounds, cellBounds, rowIndex, elementState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);}}}public class DataGridViewDisableCheckBoxColumn : DataGridViewCheckBoxColumn{public DataGridViewDisableCheckBoxColumn(){this.CellTemplate = new DataGridViewDisableCheckBoxCell();}}主要是要实现DataGridViewDisableCheckBoxCell的呈现方式,其中设置了CheckBoxState的状态为MixedDisabled,表示支持三种状态,这个是实现效果的核心,如果要实现RadioButton列的效果,只需要将Paint方法改成下面这样即可:protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates elementState, object value, object formattedValue, string errorText,DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts){// Draw the cell background, if specified.if ((paintParts & DataGridViewPaintParts.Background) == DataGridViewPaintParts.Background){SolidBrush cellBackground = newSolidBrush(cellStyle.BackColor);graphics.FillRectangle(cellBackground, cellBounds);cellBackground.Dispose();}// Draw the cell borders, if specified.if ((paintParts & DataGridViewPaintParts.Border) == DataGridViewPaintParts.Border){PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle);}// Calculate the area in which to draw the checkBox.RadioButtonState state = value != null && (SelectedStatus)value == SelectedStatus.Selected ? RadioButtonState.CheckedNormal : RadioButtonState.UncheckedNormal;Size size = RadioButtonRenderer.GetGlyphSize(graphics, state);Point center = new Point(cellBounds.X, cellBounds.Y);center.X += (cellBounds.Width - size.Width) / 2;center.Y += (cellBounds.Height - size.Height) / 2;// Draw the disabled checkBox.RadioButtonRenderer.DrawRadioButton(graphics, center, state);}使用RadioButtonState代替CheckBoxState。