轉帖|使用教程|編輯:龔雪|2018-02-11 10:21:59.000|閱讀 437 次
概述:本文分享了 DevExpress Gridview下拉框repositoryItemComboBox控件的實現過程。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
本人最近使用到 DevExpress Gridview下拉框repositoryItemComboBox控件,下面就詳細寫一下這個實現的過程,分享一下,同時也是對這個知識再次熟悉一遍。
【DXperience Universal Suite下載】
一、綁定前準備
這一部分基本上是一些基礎的知識,但也有些地方要注意的。
1、添加下拉框列
在Grid Designer中,添加一列,在這列的ColumnEdit熟悉中,可以選擇這列的編輯樣式,比如讓這列是一個按鈕或者選擇框等等,這里我們選擇下拉框,如圖:
這個下拉框默認被命名為repositoryItemComboBox1,我們對這列的操作,就是對repositoryItemComboBox1的操作。
2、為gridview添加bindingSource
這里要用bindingSource作為數據源,這是為了實 現在repositoryItemComboBox1選擇了一個值之后,gridview能夠將它顯示,repositoryItemComboBox的 很大一個缺陷就是當你選擇一個值之后,不能像傳統gridview下拉框那樣,會讓他顯示在gridview中,而且當你鼠標點擊另外一個單元格之后,就 會消失,變成空白或原來的數據。所以需要用bindingSource來綁定一個datatable,當repositoryItemComboBox1 選擇一個值之后,將值傳給datatable對應的列,當點擊另外一個單元格或者其他地方時,bindingSource會刷新綁定的 datatable。
二、綁定數據
我在窗體加載的時候,調用了一個BindDataSource()的自定義方法,這個方法是實現為repositoryItemComboBox1綁定選 擇值以及為bindingSource綁定一個datatable 。BindDataSource()代碼如下:
private void BindDataSource() { //1.為repositoryItemComboBox1綁定數據 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綁定數據)中,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()是一個自定義的創建一張datatable的方法,實際工作中,可以是從數據庫中獲取一張表等,我這里就以我創建的表為例,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的處理
完成上述的內容,當我們運行程序的時候,會發現,datagridview顯示datatable中的值,下拉框有我們綁定的數據,但是當我在下拉框中選 擇一個值離開后,gridview不會顯示我們選中的值,而是回到原值。我們就要想辦法讓我們選中一個值時,保存到datatable中,這樣當我們離開 后,bindingSource自然會刷新gridview,以達到顯示選中值的效果。
(1)那么如何實現將選中的值保存到datatable,因為我們的bindingSource綁定的是一個全局的datatable,所以只要獲取到選 中值,很容易就能給datatable賦值,到這里容易被難住,因為我們不能像對待其他控件一樣,在他的屬性中找到他的某某事件,雙擊進入代碼編寫,我們 找不到查看repositoryItemComboBox1的屬性界面。那就另尋道路,利用委托,于是,我們在之前的BindDataSource()方法中,加入一個委托方法,BindDataSource()代碼變為:
private void BindDataSource() { //1.為repositoryItemComboBox1綁定數據 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)完成到這里,先不要急著運行,因為當運行的時候,又會有一個新的問題,選中的值會保存到datatable,但是gridview的單元格不答應,提示對象必須實現Iconvertible:
解決辦法是,繼續在BindDataSource()中添加一個委托方法解決它,BindDataSource()代碼變為:
private void BindDataSource() { //1.為repositoryItemComboBox1綁定數據 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小白
===============================================================本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都控件網