DataGrid使用技巧

** DataGrid ** ** 使用技巧 ** ** **

------- 如何屏蔽单元格输入

有时候听有些朋友抱怨 .NET 的 DataGrid 不是很好用。就我个人的体会, DataGrid 的功能非常强大,可以使我们随心所欲的完成各种各样的工作,可惜就是实现起来不够简单明了。我对平时经常碰到的一些问题积累了一些解决的方法,现在把它们总结一下供大家参考。

比较经常碰到的一个问题是:我们希望 DataGrid 的某一列只能输入特定的文本,比如:不能输入数字。下面的例子说明如何实现这种功能。
新建一个 Window 应用程序,加入一个 DataGrid 和 SqlConnection ,连接 SQL 数据库 NorthWind 。

namespace WindowsApplication1
{
public class Form1 : System.Windows.Forms.Form
{
private myDataGrid dataGrid1;
private System.Data.SqlClient.SqlConnection sqlConnection1;
// 加入全局变量 oldValue ,用它表示单元格原来的文本。
private string oldValue;

private void Form1_Load(object sender, System.EventArgs e)
{
oldValue="";
SqlDataAdapter sda=new SqlDataAdapter("select LastName,FirstName from employees",this.sqlConnection1);
DataSet ds=new DataSet();
sda.Fill(ds,"employees");
DataGridTableStyle ats=new DataGridTableStyle();
ats.MappingName="employees";
DataGridColorColumn dcs1=new DataGridColorColumn();
dcs1.HeaderText="lastname";
ats.GridColumnStyles.Add(dcs1);
DataGridTextBoxColumn dcs2=new DataGridTextBoxColumn();
dcs2.HeaderText="firstname";
dcs2.MappingName="FirstName";
dcs2.TextBox.TextChanged+=new EventHandler(DataGridTextChanged);
dcs2.TextBox.Enter+=new EventHandler(DataGridTextBox_Enter);
ats.GridColumnStyles.Add(dcs2);
this.dataGrid1.TableStyles.Add(ats);
this.dataGrid1.DataSource=ds;
this.dataGrid1.DataMember="employees";
}

private void DataGridTextBox_Enter(object sender,EventArgs e)
{
// 当某一单元格获得焦点时,记录单元格的文本
oldValue=((DataGridTextBoxColumn) this.dataGrid1.TableStyles[0].GridColumnStyles[1]).TextBox.Text;
}

private void DataGridTextChanged(object sender,EventArgs e)
{
int index=0;
string str=((DataGridTextBoxColumn)this.dataGrid1.TableStyles[0].GridColumnStyles[1]).TextBox.Text;
// 当单元格的文本改变时,检验是否有非法字符
while(index

 1<str.length) ");="" (((topheadercolumn)o).caption,="" (((topheadercolumn)o).image!="null)" ((datagridtextboxcolumn)this.datagrid1.tablestyles[0].gridcolumnstyles[1]).textbox.text="oldValue;" (char.isdigit(str,index))="" (object="" (x="" +="new" .net="" 1="" 2;="" :="" ;="" \------------="" \\\="" address,city="" al="" al.add(tc1);="" al.add(tc2);="" al;="" arraylist="" arraylist();="" c1="new" c1.headertext="lastname" c1.mappingname="lastname" c1.widthchanged+="new" c2="new" c2.headertext="firstname" c2.mappingname="firstname" c2.widthchanged+="new" c3="new" c3.headertext="Address" c3.mappingname="Address" c3.widthchanged+="new" c4="new" c4.headertext="City" c4.mappingname="City" c4.widthchanged+="new" caption="" caption;="" caption;}="" captionfont="" captionfont,new="" captiontext="" captionvisible="" class="" columncollection="" columncollection;="" da="new" da.fill(ds,"employees");="" datagrid="" datagrid1;="" datagrid1_paint(object="" datagridtablestyle="" datagridtablestyle();="" datagridtextboxcolumn="" datagridtextboxcolumn();="" dataset="" dataset();="" ds="new" dts="new" dts.gridcolumnstyles.add(c1);="" dts.gridcolumnstyles.add(c2);="" dts.gridcolumnstyles.add(c3);="" dts.gridcolumnstyles.add(c4);="" dts.mappingname="employees" e)="" e.graphics.drawimage(((topheadercolumn)o).image,x-imagelist1.images[0].size.width,0);="" e.graphics.drawstring(((topheadercolumn)o).caption,this.datagrid1.="" employees",this.sqlconnection1);="" eventhandler(this.abc);="" firstname,="" foreach="" form1="" form1_load(object="" from="" get="" hscrollbar="" if="" image="" image;}="" imagelist="" imagelist1;="" in="" index="" index++;="" initializecomponent()="" int="" lastname,="" left="this.dataGrid1.TableStyles[0].RowHeaderWidth-this.dataGrid1.HScrollBar.Value;" measurestring="" messagebox.show("="" mydatagrid="" mydatagrid()="" mydatagrid:datagrid="" namespace="" northwind="" o="" object="" painteventargs="" private="" public="" return;="" scrollbar="" sender,="" set="" solidbrush(this.datagrid1.captionforecolor),x,0);="" sql="" sqlconnection="" sqlconnection1;="" sqldataadapter="" sqldataadapter("select="" string="" system.data.sqlclient.sqlconnection="" system.eventargs="" system.windows.forms.="" system.windows.forms.form="" system.windows.forms.imagelist="" system.windows.forms.painteventhandler(this.datagrid1_paint);="" tc1="new" tc1.caption="Name" tc1.columncollection.add(0);="" tc1.columncollection.add(1);="" tc1.image="this.imageList1.Images[0];" tc1.width="c1.Width+c2.Width;" tc2="new" tc2.caption="Address" tc2.columncollection.add(2);="" tc2.columncollection.add(3);="" tc2.width="c3.Width+c4.Width;" this.al)="" this.columncollection="new" this.columncollection;}="" this.datagrid1="new" this.datagrid1.captionfont).="" this.datagrid1.datamember="employees" this.datagrid1.datasource="ds;" this.datagrid1.paint="" this.datagrid1.tablestyles.add(dts);="" this.horizscrollbar;}="" topheadercolumn="" topheadercolumn()="" topheadercolumn();="" true,captiontext="" void="" width="" width))="" width;="" width;}="" window="" windowsapplication1="" x="left+(((TopHeaderColumn)o).Width-Convert.ToInt32(e.Graphics." {="" {caption="value;}" {image="value;}" {return="" {this.columncollection="value;}" {width="value;}" }="" 、="" 。="" 。当然,还得加入上面的代码="" 不是很好用。就我个人的体会,="" 不能输入数字,请重新输入="" 做一点修改。="" 列的宽变动时调整表头宽度="" 另外,因为以后的代码需要="" 和="" 在="" 好了,可以工作了。新建一个="" 如何实现多行表头="" 如果发现数字,显示错误信息并将单元格还原为原内容="" 完成表头绘制="" 属性。于是我就想能不能在="" 属性。注意,="" 应用程序,加入一个="" 建立自画的表头类并将它们加入集合="" 必须设为="" 所示。="" 数据库="" 无法取得水平滚动条的位置,所以需要对="" 有时候听有些朋友抱怨="" 比较经常碰到的一个问题是:我们希望="" 水平滚动条的位置,而="" 用来记录属于表头管辖的各列的信息(通过往集合里添加="" 的="" 的功能非常强大,可以使我们随心所欲的完成各种各样的工作,可惜就是实现起来不够简单明了。我对平时经常碰到的一些问题积累了一些解决的方法,现在把它们总结一下供大家参考。="" 的各列="" 的显示区域画出多行表头。下面的示例代码实现了这个想法,结果如图="" 的表头是多行的(图="" 表头的图标="" 表头的宽度="" 表头的显示文本="" 表头类="" 计算出第一个表头的左边距="" 计算出表头文字(文字居中)的左边距="" 记录它管辖的列的="" 设置="" 遍历表头集合="" 里加入这一句:="" 首先需要编写一个类来表示自画的表头,这个类将记录表头的显示文本、图标和属于它管辖的列的信息。="" )="" )。我在网上找了很久也找不到解决的方法,后来想到了="" ,并根据你的需要设置其他的="" ,画出表头="" ,连接="">0)   
 2e.Graphics.DrawLine(new Pen(Color.Black,2),left-1,0,left-1,this.dataGrid1.Height);   
 3//  计算出下一个表头的左边距    
 4left+=((TopHeaderColumn)o).Width;   
 5}   
 6if (x&lt;this.dataGrid1.Width)   
 7e.Graphics.DrawLine(new Pen(Color.Black,2),left-1,0,left-1,this.dataGrid1.Height);   
 8} 
 9
10private void abc(object sender,EventArgs e)   
11{   
12//  设置表头的宽度    
13foreach (object o in this.al)   
14{   
15((TopHeaderColumn)o).Width=0;   
16foreach (int i in ((TopHeaderColumn)o).ColumnCollection)   
17{ ((TopHeaderColumn)o).Width+=this.dataGrid1.TableStyles[0].GridColumnStyles[i].Width;   
18}   
19}   
20} 
21
22private void dataGrid1_Scroll(object sender, System.EventArgs e)   
23{   
24this.dataGrid1.Refresh();   
25} 
26
27上面的代码实现了两层表头,至于三层表头也同理。 
28
29关于如何实现  DataGrid  多层表头,许多网友都提到,目前好像没有一种特别好的方便的方法。 
30
31\--------如何实现下拉列表 
32
33有时候听有些朋友抱怨  .NET  的  DataGrid  不是很好用。就我个人的体会,  DataGrid  的功能非常强大,可以使我们随心所欲的完成各种各样的工作,可惜就是实现起来不够简单明了。我对平时经常碰到的一些问题积累了一些解决的方法,现在把它们总结一下供大家参考。    
34比较经常碰到的一个问题是:在编辑单元格内容时我们希望出现这样的下拉列表,如图  1  所示: 
35
36  
37图  1 
38
39** 思路:  **   
401  写一个类  comboForm  &lt;SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体</str.length)>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus