在DataGrid中使用下拉列表ComboBox控件

时间:2022-09-08 20:13:30
在使用Microsoft.NetFramework环境下编写数据库方面的软件时,经常要用到DataGrid数据显示控件,但同时也发现,DataGrid提供的网格显示中,只有两种:一种是普通的Text控件,另一种则是CheckBox控件,显示形式极少。但我们经常需要实现下拉列表控件的显示形式。
由于DataGrid中列的显示样式是由DataGridTextBoxColumn和DataGridBoolColumn类控制的;前者为显示样式为Text控件样式,后者则为CheckBox控件样式。由于我们需要在DataGrid的网格中显示ComboBox下列拉表样式,因为我们写了一个新类,继承于DataGridTextBoxColumn类。以下是类的定义代码:
 
    ///<summary>
    /// · 本类实现 DataGrid 中实现 ComboBox 样式,并取得选取的字符串的值
    ///</summary>
    public class DataGridComboColumnString:DataGridTextBoxColumn
    {
       private ComboBox comboBox;
       private CurrencyManager _source; // 当前管理的数据源
       private int rowNum; // 记录显示控件的行
       public ComboBox Cb
       {
           get
           {
              return comboBox;
           }
       }
 
       public DataGridComboColumnString()
       {
           comboBox= new ComboBox();
           this.comboBox.Leave+=new EventHandler(comboBox_leave);
           this.comboBox.SelectedValueChanged+=new EventHandler(Select_click);
       }
       //comboBox 焦点丢失时,控件自动隐藏
       private void comboBox_leave(object sender,EventArgs e)
       {
           comboBox.Visible= false;
       }
       // 当选取下拉列表中的字符串时,将获取的字符串值返回到 DataGrid 中去
       private void Select_click(object sender,EventArgs e)
       {          this.SetColumnValueAtRow(_source,rowNum,comboBox.SelectedItem.ToString());// 设置当前列中选中行的字符串值
           comboBox.Visible= false;    
       }
       // 重写 Edit 方法,以将 Text 控件的显示样式改为 comboBox 显示样式
       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);
           this.TextBox.Visible=false;
           comboBox.Visible= true;
           comboBox.BringToFront();
           comboBox.Focus();
           _source=dataSource;
           this.rowNum=rowNum;
       }
    }
上面的类中,实现了ComboBox的显示样式,并将选择的字符串值返回给了当前管理的数据源。但有时,我们需要的不是选中的字符串值,而是选中的索引值时,只需要将Select_click方法,稍加改写即可,将其中的代码改为:
           this.SetColumnValueAtRow(_source,rowNum,comboBox.SelectedIndex.ToString());
comboBox.Visible= false;
即可。
下面的代码是使用此类的方法:
       DataGridComboColumnString qxdh= new DataGridComboColumnString();
       qxdh.MappingName="qxdh";
       qxdh.Width=120;
       qxdh.HeaderText="登陆人员操作单位";
       qxdh.Cb.Items.Add("41");
    qxdh.Cb.Items.Add("42");
       qxdh.Cb.Items.Add("52");
    qxdh.Cb.Items.Add("62");
当然我们也可以通过Select_click方法进行扩展,达到很多目的,比如说数据验证,或者通过获取的值进行数据库查询,以将查询所得的值返回给当前管理的数据源,也未尝不可;同样可以重载Edit函数,以实现你需要的显示样式。