在使用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函数,以实现你需要的显示样式。