在GridControl控件中使用SearchLookUpEdit構建數據快速輸入


較早之前,曾經介紹了一篇文章《使用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
            }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM