DataGrid使用技巧(三)

2008-01-16  来源:   浏览次数 0

DataGrid使用技巧(三)

--------如何实现下拉列表

       有时候听有些朋友抱怨.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;}
  }
  9 7 3 1 2 3 4 8 :

相关主题:

网友评论