DevExpress使用教程:Gridview下拉框
本人最近使用到 DevExpress Gridview下拉框repositoryItemComboBox控件,下面就詳細(xì)寫一下這個實現(xiàn)的過程,分享一下,同時也是對這個知識再次熟悉一遍。
【DXperience Universal Suite下載】
一、綁定前準(zhǔn)備
這一部分基本上是一些基礎(chǔ)的知識,但也有些地方要注意的。
1、添加下拉框列
在Grid Designer中,添加一列,在這列的ColumnEdit熟悉中,可以選擇這列的編輯樣式,比如讓這列是一個按鈕或者選擇框等等,這里我們選擇下拉框,如圖:
這個下拉框默認(rèn)被命名為repositoryItemComboBox1,我們對這列的操作,就是對repositoryItemComboBox1的操作。
2、為gridview添加bindingSource
這里要用bindingSource作為數(shù)據(jù)源,這是為了實 現(xiàn)在repositoryItemComboBox1選擇了一個值之后,gridview能夠?qū)⑺@示,repositoryItemComboBox的 很大一個缺陷就是當(dāng)你選擇一個值之后,不能像傳統(tǒng)gridview下拉框那樣,會讓他顯示在gridview中,而且當(dāng)你鼠標(biāo)點擊另外一個單元格之后,就 會消失,變成空白或原來的數(shù)據(jù)。所以需要用bindingSource來綁定一個datatable,當(dāng)repositoryItemComboBox1 選擇一個值之后,將值傳給datatable對應(yīng)的列,當(dāng)點擊另外一個單元格或者其他地方時,bindingSource會刷新綁定的 datatable。
二、綁定數(shù)據(jù)
我在窗體加載的時候,調(diào)用了一個BindDataSource()的自定義方法,這個方法是實現(xiàn)為repositoryItemComboBox1綁定選 擇值以及為bindingSource綁定一個datatable 。BindDataSource()代碼如下:
private void BindDataSource() { //1.為repositoryItemComboBox1綁定數(shù)據(jù) for (int i = 0; i < 3; i++) { CboItemEntity item = new CboItemEntity(); item.Text = "這是" + i; item.Value = i; repositoryItemComboBox1.Items.Add(item); } //2.為bindingSource綁定一個datatable dt = InitDt(); bindingSource1.DataSource = dt; }
(1)在上述代碼1(1.為repositoryItemComboBox1綁定數(shù)據(jù))中,CboItemEntity 是一個實體類,代碼如下:
public class CboItemEntity { private object _text = 0; private object _Value = ""; /// <summary> /// 顯示值 /// </summary> public object Text { get { return this._text; } set { this._text = value; } } /// <summary> /// 對象值 /// </summary> public object Value { get { return this._Value; } set { this._Value = value; } } public override string ToString() { return this.Text.ToString(); } }
(2)在代碼2(2.為bindingSource綁定一個datatable)中,dt是一個全局變量,InitDt()是一個自定義的創(chuàng)建一張datatable的方法,實際工作中,可以是從數(shù)據(jù)庫中獲取一張表等,我這里就以我創(chuàng)建的表為例,InitDt()代碼如下:
private DataTable InitDt() { dt.Columns.Add("check", typeof(bool)); dt.Columns.Add("id", typeof(int)); dt.Columns.Add("name", typeof(string)); dt.Columns.Add("sex", typeof(int)); dt.Columns.Add("address", typeof(string)); dt.Columns.Add("aihao", typeof(string)); dt.Columns.Add("shuju", typeof(decimal)); dt.Columns.Add("time", typeof(DateTime)); dt.Columns.Add("zidingyi", typeof(string)); dt.Columns.Add("value", typeof(int)); dt.Columns.Add("text", typeof(string)); dt.Rows.Add(new object[] { 0, 1, "張三", 1, "東大街6號", "看書", -52.874, "2011-8-5 17:52:55", "###", 0, "這是0" }); dt.Rows.Add(new object[] { 0, 6, "張三", 1, "東大街6號", "看書", -52.874, "2011-8-5 17:52:55", "###", 1, "這是1" }); dt.Rows.Add(new object[] { 0, 11, "張三", 1, "東大街6號", "看書", -52.874, "2011-8-5 17:52:55", "###", 2, "這是2" });return dt; }
這里只需要注意最后兩列就行了,value列是用來保存下拉框的實際值,text列是保存下拉框的選擇值。
三、repositoryItemComboBox的處理
完成上述的內(nèi)容,當(dāng)我們運(yùn)行程序的時候,會發(fā)現(xiàn),datagridview顯示datatable中的值,下拉框有我們綁定的數(shù)據(jù),但是當(dāng)我在下拉框中選 擇一個值離開后,gridview不會顯示我們選中的值,而是回到原值。我們就要想辦法讓我們選中一個值時,保存到datatable中,這樣當(dāng)我們離開 后,bindingSource自然會刷新gridview,以達(dá)到顯示選中值的效果。
(1)那么如何實現(xiàn)將選中的值保存到datatable,因為我們的bindingSource綁定的是一個全局的datatable,所以只要獲取到選 中值,很容易就能給datatable賦值,到這里容易被難住,因為我們不能像對待其他控件一樣,在他的屬性中找到他的某某事件,雙擊進(jìn)入代碼編寫,我們 找不到查看repositoryItemComboBox1的屬性界面。那就另尋道路,利用委托,于是,我們在之前的BindDataSource()方法中,加入一個委托方法,BindDataSource()代碼變?yōu)椋?/p>
private void BindDataSource() { //1.為repositoryItemComboBox1綁定數(shù)據(jù) for (int i = 0; i < 3; i++) { CboItemEntity item = new CboItemEntity(); item.Text = "這是" + i; item.Value = i; repositoryItemComboBox1.Items.Add(item); } //2.為bindingSource綁定一個datatable dt = InitDt(); bindingSource1.DataSource = dt; //3.下拉框選中值改變事件 repositoryItemComboBox1.SelectedIndexChanged += new EventHandler(ComboBoxEdit_SelectedIndexChanged); }
上述代碼3(3.下拉框選中值改變事件)中,ComboBoxEdit_SelectedIndexChanged的代碼如下:
void ComboBoxEdit_SelectedIndexChanged(object sender, EventArgs e) { CboItemEntity item = new CboItemEntity(); try { //1.獲取下拉框選中值 item = (CboItemEntity)(sender as ComboBoxEdit).SelectedItem; string text = item.Text.ToString(); int value =(int)item.Value; //2.獲取gridview選中的行 GridView myView=(gridControl1.MainView as GridView); int dataIndex = myView.GetDataSourceRowIndex(myView.FocusedRowHandle); //3.保存選中值到datatable dt.Rows[dataIndex]["value"] = value; dt.Rows[dataIndex]["text"] = text; } catch (Exception ex) { XtraMessageBox.Show(ex.Message, "提示"); } }
(2)完成到這里,先不要急著運(yùn)行,因為當(dāng)運(yùn)行的時候,又會有一個新的問題,選中的值會保存到datatable,但是gridview的單元格不答應(yīng),提示對象必須實現(xiàn)Iconvertible:
解決辦法是,繼續(xù)在BindDataSource()中添加一個委托方法解決它,BindDataSource()代碼變?yōu)椋?/p>
private void BindDataSource() { //1.為repositoryItemComboBox1綁定數(shù)據(jù) for (int i = 0; i < 3; i++) { CboItemEntity item = new CboItemEntity(); item.Text = "這是" + i; item.Value = i; repositoryItemComboBox1.Items.Add(item); } //2.為bindingSource綁定一個datatable dt = InitDt(); bindingSource1.DataSource = dt; //3.下拉框選中值改變事件 repositoryItemComboBox1.SelectedIndexChanged += new EventHandler(ComboBoxEdit_SelectedIndexChanged); //4.解決IConvertible問題 repositoryItemComboBox1.ParseEditValue += new ConvertEditValueEventHandler(repositoryItemComboBox1_ParseEditValue); }
在上述代碼4(4.解決IConvertible問題)中,repositoryItemComboBox1_ParseEditValue的代碼如下:
void repositoryItemComboBox1_ParseEditValue(object sender, ConvertEditValueEventArgs e) { e.Value = e.Value.ToString(); e.Handled = true; }
到這里,就已全部完成咯,效果圖:
Via博客園i小白