較早之前,曾經介紹了一篇文章《使用DataGridView數據窗口控件,構建用戶快速輸入體驗》,介紹了在傳統DataGridView中嵌入一個數據窗口進行選擇列表,從而實現數據快速錄入的操作例子,在DevExpress的控件使用中,我們應該如何實現這種效果呢,本文首先通過簡單的例子介紹一下,具體的實現過程。然后進階具體的應用,指導我們實際的開發工作,以及在使用過程中需要注意的一些特殊問題,提供相應的解決方法。
1、 GridControl集成SearchLookUpEdit的效果展現
首先我們來介紹一下整個效果圖,以便有感性的印象。
1)啟動后默認效果
2)彈出窗體效果
3)選中數據后效果圖
其實上面是一個測試的例子,具體的應用會比較復雜一點,不過操作過程差不多,我們都是在一個Cell里面嵌入一個可以選擇(包括查詢)的數據列表,從中選擇我們需要的內容,然后可以在另外一個Cell中輸入一些其他的信息,保存的時候,一並保存即可。
2、GridControl集成SearchLookUpEdit的實現過程
在開始介紹之前,我們要清楚,這個GridControl必須先綁定數據源(數據源可以為空),如果不綁定數據源,那么雖然可以彈出列表供選擇,但是鼠標移開值就會丟失的問題,一開始不明白其中道理,搞了很久。
首先要為GridControl添加兩個字段,設置好他們的顯示Caption和FieldName即可,然后在我們需要彈出窗口的單元格對象中,選擇它的ColumnEdit控件為SearchLookup控件即可,如下所示。
這個時候,它會生成一個repositoryItemSearchLookUpEdit1的控件,這個控件就是該單元格的內嵌編輯控件了,可以從中選擇列表的值,我們設置這個列表的DisplayMember為Name(顯示的字段內容),ValueMember為ID(保存的值字段),如下所示。
除了你要設置主窗體里面的GridControl運行添加列外,你還需要設置編輯控件里面的View中OpitonsView里面的NewItemRowPosition為Botton(默認為None),這一步很重要,否則無法出現一個新建的行給你錄入數據的。
例子代碼比較簡單,主要是為了演示這種方式的使用,代碼如下所示
DataTable dt = new DataTable(); private void Form1_Load(object sender, EventArgs e) { dt.Columns.Add("ID"); dt.Columns.Add("Name"); for (int i = 0; i < 100; i++) { DataRow row = dt.NewRow(); row["ID"] = i.ToString(); row["Name"] = (new Random()).NextDouble().ToString(); dt.Rows.Add(row); System.Threading.Thread.Sleep(1); } this.repositoryItemSearchLookUpEdit1.DataSource = dt; this.gridControl1.DataSource = dt.Clone(); } private void gridView1_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e) { if (e.Column.FieldName == "ID") { string id = e.Value.ToString(); DataRow[] dr = dt.Select(string.Format("ID = '{0}'", id)); if(dr != null && dr.Length > 0) { DataRow row = dr[0]; string name = row["Name"].ToString(); gridView1.SetRowCellValue(e.RowHandle, "Name", name); } } }
3、 GridControl集成SearchLookUpEdit的實際案例操作
一個實際的案例就是門診的時候,醫生用葯的情況,除了選擇其他內容外,主要的就是快速錄入葯品信息。我們平常去大一點 的醫院看病,好像看到的多數操作都是這樣。還有一種方式就是銷售人員提供的報價單,從產品里面選擇信息,然后修改下價格,這些場景都是很適合這樣的操作的。下面是一個門診的例子。
在實際應用中,我們在編輯一些歷史數據的時候,不希望原來的記錄被修改,但是可以增加新的記錄,但是前面所有介紹的內容,沒有能夠解決這個問題,那么我們應該如何操作才能實現這個效果呢?
其實GridView對象里面有一個ShowingEditor的事件,用來判斷是否顯示單元格的編輯器的,這樣我們對數據庫已有記錄進行控制,不讓它在列表中顯示編輯控件出來即可,具體代碼如下所示。
this.gridView1.ShowingEditor += new CancelEventHandler(gridView1_ShowingEditor);//實際使用的代碼 void gridView1_ShowingEditor(object sender, CancelEventArgs e) { object ID = this.gridView1.GetRowCellValue(this.gridView1.FocusedRowHandle, "ID"); if (ID != null && !string.IsNullOrEmpty(ID.ToString())) { e.Cancel = true; } }
在保持數據的時候,我們對歷史數據就不用修改保持,只需要針對新增的內容即可,如何做到的呢?其實就是判定他的綁定值是否存在即可,如果有綁定值,那么就是歷史的數據,沒有就是新的,進行特殊操作即可,如下代碼所示。
if (this.gridView1.RowCount > 0) { #region 提交用葯記錄明細 for (int i = 0; i < this.gridView1.RowCount; i++) { //根據ID來判斷是否新增的用葯記錄 object ID = this.gridView1.GetRowCellValue(i, "ID"); if (ID == null || string.IsNullOrEmpty(ID.ToString())) { //......................... } } #endregion }