在很多DevExpress的使用例子里面,我們可以看到,基於GridView實現的不同控件展示的時候,每一列的控件類型都是一樣的,如果我要某一列的一行讓用戶可以從下列列表選擇選項,而其他行不可選擇,那我們可以實現這種效果嗎,應該如何實現?
1、GridView實現的顯示效果
例如下面的效果就是我希望達到的,在第一行的流程處理人列允許用戶選擇,其他行禁止用戶選擇。
單用戶單擊第一行的“流程處理人”列的時候,彈出一個列表供用戶選擇,選擇后顯示具體的人員的姓名即可。
2、功能實現具體步驟
實現上面所說的功能,最主要就是創建兩個In-place(嵌入)的編輯器,一個用於特定行的編輯,一個用於其他行的編輯。如下所示。
從上面可以看到,我添加了一個LookupEdit控件和一個TextEdit的控件,分別用來操作不同的行列內容。
然后就是需要實現gridView的單元格自定義編輯事件,如下所示。
this.gridView1.CustomRowCellEdit += new DevExpress.XtraGrid.Views.Grid.CustomRowCellEditEventHandler(this.gridView1_CustomRowCellEdit);
然后在事件實現里面,對不同的行,指定不同的編輯器,如下代碼所示。
private void gridView1_CustomRowCellEdit(object sender, DevExpress.XtraGrid.Views.Grid.CustomRowCellEditEventArgs e) { if (e.Column.FieldName == "ProcUser") { if (e.RowHandle == 0) { e.RepositoryItem = this.repositoryddlProcUser; } else { e.RepositoryItem = this.repositorytxtProcUser; } } }
最后,還需要實現這兩個內嵌的編輯控件的ParseValue事件,如下所示。
this.repositorytxtProcUser.ParseEditValue += new DevExpress.XtraEditors.Controls.ConvertEditValueEventHandler(repositorytxtProcUser_ParseEditValue); this.repositoryddlProcUser.ParseEditValue += new DevExpress.XtraEditors.Controls.ConvertEditValueEventHandler(repositoryProcUser_ParseEditValue);
void repositorytxtProcUser_ParseEditValue(object sender, DevExpress.XtraEditors.Controls.ConvertEditValueEventArgs e) { e.Value = "人員未定"; } void repositoryProcUser_ParseEditValue(object sender, DevExpress.XtraEditors.Controls.ConvertEditValueEventArgs e) { if (e.Value is String) { int result = 0; if (Int32.TryParse((String)e.Value, out result)) { e.Value = result; e.Handled = true; } } }
這樣,我們就能實現上面所說的效果,可以在某行列里面顯示下拉列表,其他的行列顯示文本框,並且文本框不可以編輯的操作了。
通過以上的操作,我們還可以為某行列指定更多不同類型的內嵌編輯控件,從而豐富我們的列表單元格編輯操作