DataGrid使用技巧(三)
点击次数:20 次 发布日期:2008-11-26 11:12:24 作者:源代码网
|
源代码网推荐 源代码网推荐 --------如何实现下拉列表 源代码网推荐 源代码网推荐 有时候听有些朋友抱怨.NET的DataGrid不是很好用。就我个人的体会,DataGrid的功能非常强大,可以使我们随心所欲的完成各种各样的工作,可惜就是实现起来不够简单明了。我对平时经常碰到的一些问题积累了一些解决的方法,现在把它们总结一下供大家参考。 源代码网推荐 比较经常碰到的一个问题是:在编辑单元格内容时我们希望出现这样的下拉列表,如图1所示: 源代码网推荐 源代码网推荐 源代码网推荐 图1 源代码网推荐 源代码网推荐 思路: 源代码网推荐 1 写一个类comboForm表示下拉列表,类包含两个成员:Form窗体和DataGrid组件。 源代码网推荐 2 写一个类NoKeyUpComboBox(继承ComboBox),目的是屏蔽WM_KEYUP消息,避免在按Tab键时出现问题。 源代码网推荐 3 写一个继承于DataGridTextBoxColumn的类,命名为DataGridComboFormColumn。在类中加入一个ComboBox和一个comboForm,类实现下面几个功能: 源代码网推荐 a 编辑单元格内容时显示组件NoKeyUpComboBox; 源代码网推荐 b ComboBox下拉时显示下拉列表comboForm; 源代码网推荐 c 鼠标点击下拉列表时,隐藏comboForm并将用户选定的内容写入单元格(当然,你也可以设置其他隐藏下拉列表的操作,比如按回车键); 源代码网推荐 d 下拉列表comboForm不具有焦点时隐藏。 源代码网推荐 源代码网推荐 代码: 源代码网推荐 //comboForm类: 源代码网推荐 public class comboForm:Form 源代码网推荐 { 源代码网推荐 private DataGrid dataGrid; 源代码网推荐 public DataGrid DataGrid 源代码网推荐 { 源代码网推荐 get {return dataGrid;} 源代码网推荐 set {dataGrid=value;} 源代码网推荐 } 源代码网推荐 public comboForm() 源代码网推荐 { 源代码网推荐 this.FormBorderStyle=FormBorderStyle.None; 源代码网推荐 this.StartPosition=FormStartPosition.Manual; 源代码网推荐 dataGrid=new DataGrid(); 源代码网推荐 this.Controls.Add(dataGrid); 源代码网推荐 dataGrid.Dock=DockStyle.Fill; 源代码网推荐 dataGrid.CaptionVisible=false; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 //NoKeyUpComboBox类: 源代码网推荐 public class NoKeyUpComboBox:ComboBox 源代码网推荐 { 源代码网推荐 const int WM_KEYUP=0x101; 源代码网推荐 protected override void WndProc(ref Message msg) 源代码网推荐 { 源代码网推荐 if (msg.Msg==WM_KEYUP) 源代码网推荐 return; 源代码网推荐 base.WndProc(ref msg); 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 //DataGridComboFormColumn类: 源代码网推荐 public class DataGridComboFormColumn:DataGridTextBoxColumn 源代码网推荐 { 源代码网推荐 private NoKeyUpComboBox comboBox; 源代码网推荐 private CurrencyManager _source; 源代码网推荐 private int rowNum; 源代码网推荐 private comboForm frm; 源代码网推荐 public comboForm Frm 源代码网推荐 { 源代码网推荐 get {return frm;} 源代码网推荐 } 源代码网推荐 //我们将使用Index属性表示单元格内容与下拉列表的第Index列的内容相联系 源代码网推荐 private int index; 源代码网推荐 public int Index 源代码网推荐 { 源代码网推荐 get {return index;} 源代码网推荐 set {index=value;} 源代码网推荐 } 源代码网推荐 源代码网推荐 public DataGridComboFormColumn() 源代码网推荐 { 源代码网推荐 frm=new comboForm(); 源代码网推荐 comboBox=new NoKeyUpComboBox(); 源代码网推荐 frm.Deactivate+=new EventHandler(frm_deactive); 源代码网推荐 frm.DataGrid.Click+=new EventHandler(grid_click); 源代码网推荐 this.comboBox.DropDown+=new EventHandler(comboBox_dropDown); 源代码网推荐 this.comboBox.Leave+=new EventHandler(comboBox_leave); 源代码网推荐 } 源代码网推荐 //comboBox不具有焦点时隐藏 源代码网推荐 private void comboBox_leave(object sender,EventArgs e) 源代码网推荐 { 源代码网推荐 comboBox.Visible=false; 源代码网推荐 } 源代码网推荐 //下拉列表--Frm不具有焦点时隐藏 源代码网推荐 private void frm_deactive(object sender,EventArgs e) 源代码网推荐 { 源代码网推荐 frm.Hide(); 源代码网推荐 comboBox.Visible=false; 源代码网推荐 } 源代码网推荐 //comboBox下拉时显示下拉列表--Frm 源代码网推荐 private void comboBox_dropDown(object sender,EventArgs e) 源代码网推荐 { 源代码网推荐 //在这里您还可以根据下拉列表的长与宽是否超出屏幕设置下拉列表的位置 源代码网推荐 frm.Left=comboBox.PointToScreen(new Point(0,comboBox.Height)).X; 源代码网推荐 frm.Top=comboBox.PointToScreen(new Point(0,comboBox.Height)).Y; 源代码网推荐 frm.Show(); 源代码网推荐 frm.BringToFront(); 源代码网推荐 } 源代码网推荐 //点击下拉列表的DataGrid时,将选中的内容写入单元格并隐藏下拉列表--Frm 源代码网推荐 private void grid_click(object sender,EventArgs e) 源代码网推荐 { 源代码网推荐 BindingManagerBase cm=frm.BindingContext[Frm.DataGrid.DataSource, frm.DataGrid.DataMember]; 源代码网推荐 comboBox.Text=((DataRowView)cm.Current)[index].ToString(); 源代码网推荐 this.TextBox.Text=((DataRowView)cm.Current)[index].ToString(); 源代码网推荐 frm.Hide(); 源代码网推荐 comboBox.Visible=false; 源代码网推荐 this.SetColumnValueAtRow(_source,rowNum,this.TextBox.Text); 源代码网推荐 } 源代码网推荐 //重载Edit方法,使用comboBox代替TextBox 源代码网推荐 protected override void Edit(CurrencyManager dataSource,int rowNum,Rectangle bounds,bool readOnly,string instanttext,bool cellVisible) 源代码网推荐 { 源代码网推荐 base.Edit(dataSource,rowNum,bounds,readOnly,instanttext,cellVisible); 源代码网推荐 comboBox.Parent=this.TextBox.Parent; 源代码网推荐 comboBox.Left=this.TextBox.Left-2; 源代码网推荐 comboBox.Top=this.TextBox.Top-2; 源代码网推荐 comboBox.Size=new Size(this.TextBox.Width,this.comboBox.Height); 源代码网推荐 comboBox.Text=this.TextBox.Text; 源代码网推荐 源代码网推荐 this.TextBox.Visible=false; 源代码网推荐 comboBox.Visible=true; 源代码网推荐 comboBox.BringToFront(); 源代码网推荐 comboBox.Focus(); 源代码网推荐 _source=dataSource; 源代码网推荐 this.rowNum=rowNum; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 下面的例子说明了如何使用DataGridComboFrom类: 源代码网推荐 新建一个Windows 应用程序,加入SqlConnection,连接SQL数据库Northwind,加入下面代码。 源代码网推荐 源代码网推荐 private void Form1_Load(object sender, System.EventArgs e) 源代码网推荐 { 源代码网推荐 SqlDataAdapter da=new SqlDataAdapter("select ProductName from Products",this.sqlConnection1); 源代码网推荐 DataSet ds=new DataSet(); 源代码网推荐 da.Fill(ds,"products"); 源代码网推荐 DataSet ds_Combo=new DataSet(); 源代码网推荐 da.SelectCommand=new SqlCommand("select ProductName,QuantityPerUnit,UnitPrice from Products",this.sqlConnection1); 源代码网推荐 da.Fill(ds_Combo,"products"); 源代码网推荐 源代码网推荐 DataGridTableStyle dts=new DataGridTableStyle(); 源代码网推荐 dts.MappingName="products"; 源代码网推荐 myDataGridColumn col=new myDataGridColumn(); 源代码网推荐 col.MappingName="ProductName"; 源代码网推荐 col.Width=100; 源代码网推荐 col.Index=0; 源代码网推荐 col.HeaderText="ProductName"; 源代码网推荐 源代码网推荐 col.Frm.DataGrid.DataSource=ds_Combo;//设置下拉列表的数据源 源代码网推荐 col.Frm.DataGrid.DataMember="products"; 源代码网推荐 dts.GridColumnStyles.Add(col); 源代码网推荐 源代码网推荐 this.dataGrid1.TableStyles.Add(dts); 源代码网推荐 this.dataGrid1.SetDataBinding(ds,"products"); 源代码网推荐 } 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
