在DevExpress的GridView的列中,使用RepositoryItemSearchLookUpEdit控制項實現產品列表信息的展示和選擇

来源:https://www.cnblogs.com/wuhuacong/archive/2023/06/05/17458627.html
-Advertisement-
Play Games

有時候,我們為了方便,我們往往使用擴展函數的代碼方式創建很多GridView的操作功能,如在隨筆《在DevExpress中使用BandedGridView表格實現多行表頭的處理》中介紹過多行表頭的創建及綁定處理,在《基於DevExpress的GridControl實現的一些界面處理功能》也介紹了一些... ...


有時候,我們為了方便,我們往往使用擴展函數的代碼方式創建很多GridView的操作功能,如在隨筆《在DevExpress中使用BandedGridView表格實現多行表頭的處理》中介紹過多行表頭的創建及綁定處理,在《基於DevExpress的GridControl實現的一些界面處理功能》也介紹了一些特殊的展示效果,本篇隨筆介紹在DevExpress的GridView的列中,使用RepositoryItemSearchLookUpEdit控制項實現產品列表信息的展示和選擇。

1、界面效果展示

例如我在CRM客戶管理系統裡面,有關報價單的界面如下所示。其中為了方便選擇報價單的產品,我們在DevExpress的GridView的列中,增加了一個RepositoryItemSearchLookUpEdit控制項來承載列表信息的展示的操作。如下界面所示。

如果我們是手工處理,那麼可以在GridControl的設計界面中創建所需要的列並綁定欄位信息,如下所示。

 而對應產品名稱的欄位,我們需要使用它的列編輯控制項來創建一個SearchLookupEdit的控制項,如下所示。

 然後還需要為這個視圖創建對應的列,如下所示。

手工操作看似畢竟簡單,但是不夠靈活,因此我們喜歡使用擴展函數的方式,通過代碼方式創建對應的控制項以及綁定對應的欄位信息,這樣可以極大的提高代碼的可維護性。

2、用擴展函數的方式,通過代碼方式創建對應的控制項以及綁定對應的欄位信息

我們對GridControl和GridView的對象,創建了一些擴展函數,以便於對控制項的彈性操作。

前面隨筆也介紹過擴展函數的一些內容《使用擴展函數方式,在Winform界面中快捷的綁定樹形列表TreeList控制項和TreeListLookUpEdit控制項

一般創建一些列的信息如下所示。

    var colQuantity = grv.CreateColumn("Quantity", "銷售數量");
    colQuantity.CreateSpinEdit();
    grv.CreateColumn("ProductNo", "產品編碼").CreateTextEdit();

我們這裡創建報價單信息列表,以及產品信息列表的處理代碼如下所示。

/// <summary>
/// 使用代碼創建GridView的綁定以及單元格編輯控制項
/// </summary>
private void InitGridView()
{
    var grd = this.gridControl1;
    var grv = this.gridView1;

    grv.Columns.Clear();
    grv.CreateColumn(Id_FieldName, Id_FieldName).Visible = false;//創建一個欄位,隱藏的,存儲記錄
    productNameEdit = grv.CreateColumn("ProductName", "產品名稱").CreateSearchLookUpEdit();
    grv.CreateColumn("SalePrice", "銷售單價").CreateTextEdit().ReadOnly = true;

    //colQuantity.AppearanceCell.BackColor = Color.Moccasin;
    //colQuantity.AppearanceCell.Options.UseBackColor = true;
    var colQuantity = grv.CreateColumn("Quantity", "銷售數量");
    colQuantity.AppearanceCell.BackColor = Color.Moccasin;
    colQuantity.AppearanceCell.Options.UseBackColor = true;
    colQuantity.CreateSpinEdit();

    var colNote = grv.CreateColumn("Note", "備註說明");
    colNote.AppearanceCell.BackColor = Color.Moccasin;
    colNote.AppearanceCell.Options.UseBackColor = true;
    colNote.CreateMemoEdit();
    var colExpireDate = grv.CreateColumn("ExpireDate", "過期日期");
    colExpireDate.AppearanceCell.BackColor = Color.Moccasin;
    colExpireDate.AppearanceCell.Options.UseBackColor = true;
    colExpireDate.CreateDateEdit();

    grv.CreateColumn("ProductNo", "產品編碼").CreateTextEdit();
    grv.CreateColumn("MaterialCode", "物料編碼").CreateTextEdit();
    grv.CreateColumn("ProductType", "產品類型").CreateTextEdit();
    grv.CreateColumn("Specification", "產品規格").CreateTextEdit();
    grv.CreateColumn("Model", "產品型號").CreateTextEdit();
    grv.CreateColumn("Unit", "標準單位").CreateTextEdit();

    grv.InitGridView(GridType.NewItem, false, EditorShowMode.MouseDownFocused, "");
    grv.InitNewRow += delegate (object sender, InitNewRowEventArgs e)
    {
        //數據記錄初始化的時候設置
        //grv.SetRowCellValue(e.RowHandle, "Id", Guid.NewGuid().ToString());
        //grv.SetRowCellValue(e.RowHandle, "DictType_ID", typeId);//存儲記錄的父ID
    };
    grv.ShowingEditor += new CancelEventHandler(gridView1_ShowingEditor);
    grv.CellValueChanged += new DevExpress.XtraGrid.Views.Base.CellValueChangedEventHandler(gridView1_CellValueChanged);
}

其中註意產品信息裡面,它使用了一個RepositoryItemSearchLookUpEdit控制項。

    productNameEdit = grv.CreateColumn("ProductName", "產品名稱").CreateSearchLookUpEdit();

我們把它保存在窗體的變數中,供其他部分的代碼調用創建它的視圖列信息,以及設置它的數據源等操作。

/// <summary>
/// 初始化數據字典
/// </summary>
private async void InitDictItem()
{
    //初始化代碼
    this.txtOrderStatus.BindDictItems("報價單狀態");

    //綁定產品列表
    var list = await BLLFactory<IProductService>.Instance.GetAllInUsed();
    productNameEdit.BindDictItems(list, "ProductName", "Id", true, new LookUpColumnInfo[]
    {
        new LookUpColumnInfo() { FieldName = "ProductType", Caption = "產品類型", Width = 90},
        new LookUpColumnInfo() { FieldName = "ProductName", Caption = "產品名稱", Width = 150},
        new LookUpColumnInfo() { FieldName = "SalePrice", Caption = "產品單價", Width = 60},
        new LookUpColumnInfo() { FieldName = "HandNo", Caption = "產品編碼", Width = 60},
        new LookUpColumnInfo() { FieldName = "MaterialCode", Caption = "物料編碼", Width = 60},
        new LookUpColumnInfo() { FieldName = "BarCode", Caption = "條形碼", Width = 60},
        new LookUpColumnInfo() { FieldName = "Specification", Caption = "產品規格, Width = 60"},
        new LookUpColumnInfo() { FieldName = "Model", Caption = "產品型號", Width = 60},
        new LookUpColumnInfo() { FieldName = "Color", Caption = "顏色", Width = 60},
        new LookUpColumnInfo() { FieldName = "ProductSize", Caption = "尺寸", Width = 60},
        new LookUpColumnInfo() { FieldName = "Unit", Caption = "標準單位", Width = 60},
        new LookUpColumnInfo() { FieldName = "Quantity", Caption = "產品數量", Width = 60},
        new LookUpColumnInfo() { FieldName = "Note", Caption = "備註", Width = 120},
    });
    productNameEdit.View.OptionsView.ColumnAutoWidth = false;
}

上面代碼指定了編輯控制項列表中的列,以及數據源信息,這樣通過擴展函數的代碼方式創建,省卻很多繁瑣的手工操作。

然後我們判斷主GridView的值變化的時候,跟蹤到產品信息,然後賦值給其他對應列的信息,這樣就可以複製產品的部分信息到列表中去了。

private async void gridView1_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
{
    if (e.Column.FieldName == "ProductName" && e.Value != null)
    {
        var info = await  BLLFactory<IProductService>.Instance.GetAsync(e.Value.ToString());
        if (info != null)
        {
            //if (info.Quantity <= 1)
            //{
            //    MessageUtil.ShowTips(string.Format("[{0}]庫存不足,請選擇其他產品", info.ProductName));
            //    this.gridView1.DeleteRow(e.RowHandle);
            //    return;
            //}

            this.gridView1.SetRowCellValue(e.RowHandle, "ProductNo", info.HandNo);
            this.gridView1.SetRowCellValue(e.RowHandle, "MaterialCode", info.MaterialCode);
            this.gridView1.SetRowCellValue(e.RowHandle, "ProductType", info.ProductType);
            this.gridView1.SetRowCellValue(e.RowHandle, "Specification", info.Specification);
            this.gridView1.SetRowCellValue(e.RowHandle, "Model", info.Model);
            this.gridView1.SetRowCellValue(e.RowHandle, "Unit", info.Unit);
            this.gridView1.SetRowCellValue(e.RowHandle, "SalePrice", info.SalePrice);
        }
        else
        {
            this.gridView1.SetRowCellValue(e.RowHandle, "ProductNo", DBNull.Value);
            this.gridView1.SetRowCellValue(e.RowHandle, "MaterialCode", DBNull.Value);
            this.gridView1.SetRowCellValue(e.RowHandle, "ProductType", DBNull.Value);
            this.gridView1.SetRowCellValue(e.RowHandle, "Specification", DBNull.Value);
            this.gridView1.SetRowCellValue(e.RowHandle, "Model", DBNull.Value);
            this.gridView1.SetRowCellValue(e.RowHandle, "Unit", DBNull.Value);
            this.gridView1.SetRowCellValue(e.RowHandle, "SalePrice", DBNull.Value);

            this.gridView1.SetRowCellValue(e.RowHandle, "Quantity", DBNull.Value);
            this.gridView1.SetRowCellValue(e.RowHandle, "Note", DBNull.Value);
            this.gridView1.SetRowCellValue(e.RowHandle, "ExpireDate", DBNull.Value);
        }
    }
}

在界面的保存更新操作中,我們對其中的主表和明細表進行更新處理即可,如下代碼所示。

/// <summary>
/// 編輯狀態下的數據保存
/// </summary>
/// <returns></returns>
public override async Task<bool> SaveUpdated()
{
    var info = await BLLFactory<IQuotationService>.Instance.GetAsync(ID);
    if (info != null)
    {
        SetInfo(info);

        try
        {
            #region 更新數據
            bool succeed = await BLLFactory<IQuotationService>.Instance.UpdateAsync(info);
            if (succeed)
            {
                //可添加其他關聯操作
                await SaveDetail();

                return true;
            }
            #endregion
        }
        catch (Exception ex)
        {
            LogTextHelper.Error(ex);
            MessageDxUtil.ShowError(ex.Message);
        }
    }
    return false;
}

以上就是使用擴展函數的方式,在DevExpress的GridView的列中,使用RepositoryItemSearchLookUpEdit控制項實現產品列表信息的展示和選擇的操作,希望能夠給你提供參考的思路。

專註於代碼生成工具、.Net/.NetCore 框架架構及軟體開發,以及各種Vue.js的前端技術應用。著有Winform開發框架/混合式開發框架、微信開發框架、Bootstrap開發框架、ABP開發框架、SqlSugar開發框架等框架產品。
  轉載請註明出處:撰寫人:伍華聰  http://www.iqidi.com 
    

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # 節點流 和 處理流 [TOC] - **節點流和處理流一覽圖:** ![img](https://img-blog.csdnimg.cn/img_convert/8ca5f4f2e434e5c05149bcb7ebc281a8.png) ​ 【圖片來源】http://t.csdn.cn/d52a ...
  • # 前言 生成器是Python的一種核心特性,允許我們在請求新元素時再生成這些元素,而不是在開始時就生成所有元素。它在處理大規模數據集、實現節省記憶體的演算法和構建複雜的迭代器模式等多種情況下都有著廣泛的應用。在本篇文章中,我們將從理論和實踐兩方面來探索Python生成器的深度用法。 ## 生成器的定義 ...
  • 在B站有許多坤坤的視頻,作為一名ikun,讓我們寫個爬蟲研究一下視頻的視頻的名字、鏈接、觀看次數、彈幕、發佈時間以及作者。我們用selenium來實現這個爬蟲,由於要獲取的數據比較多,我們寫幾個函數來實現這個爬蟲。 先倒入需要用到的庫,包括selenium, time ,BeautifulSoup ...
  • 鑒於公司內網安裝的python版本為python3.6.5,而此時又需要安裝第三方庫pytest,本來是想直接在Python官網PyPI直接搜對應可匹配跑python3.6.5版本的pytest進行下載然後傳到內網安裝即可,但是發現pytest依賴別的第三方庫,根據報錯裝了幾個依賴的第三方庫之後,發 ...
  • 基於java的座位預約系統,可以用於圖書館占位系統,圖書館座位預約系統,大學自習室占座系統,自習室座位預約系統,圖書館預約占座系統,自習室預約占座系統,座位預約系統等等; ...
  • 清醒點[toc] # Java虛擬線程 > 翻譯自 screencapture-pradeesh-kumar-medium-an-era-of-virtual-threads-java ```mermaid flowchart LR introduction-->a(why thread)-->b( ...
  • 基於java的倉庫管理系統設計與實現,可適用於出庫、入庫、庫存管理,基於java的出入庫管理,java出入庫管理系統,基於java的WMS倉庫管理系統,庫存物品管理系統。 ...
  • # 1、背景 在我們開發的過程中有這麼一種場景, `/projectA` 目錄是 `hadoopdeploy`用戶創建的,他對這個目錄有`wrx`許可權,同時這個目錄屬於`supergroup`,在這個組中的用戶也具有這個目錄的`wrx`許可權,對於其他人,不可訪問這個目錄。現在有這麼一個特殊的用戶`r ...
一周排行
    -Advertisement-
    Play Games
  • 一、openKylin簡介 openKylin(開放麒麟) 社區是在開源、自願、平等和協作的基礎上,由基礎軟硬體企業、非營利性組織、社團組織、高等院校、科研機構和個人開發者共同創立的一個開源社區,致力於通過開源、開放的社區合作,構建桌面操作系統開源社區,推動Linux開源技術及其軟硬體生態繁榮發展。 ...
  • 簡介 Flurl是一個用於構建基於HTTP請求的C#代碼的庫。它的主要目的是簡化和優雅地處理網路請求(只用很少的代碼完成請求)。Flurl提供了一種簡單的方法來構建GET、POST、PUT等類型的請求,以及處理響應和異常。它還提供了一些高級功能,如鏈式調用、緩存請求結果、自動重定向等。本文將介紹Fl ...
  • 一:背景 1. 講故事 最近也挺奇怪,看到了兩起 CPU 爆高的案例,且誘因也是一致的,覺得有一些代表性,合併分享出來幫助大家來避坑吧,閑話不多說,直接上 windbg 分析。 二:WinDbg 分析 1. CPU 真的爆高嗎 這裡要提醒一下,別人說爆高不一定真的就是爆高,我們一定要拿數據說話,可以 ...
  • 剛開始寫文章,封裝Base基類的時候,添加了trycatch異常塊,不過當時沒有去記錄日誌,直接return了。有小伙伴勸我不要吃了Exception 其實沒有啦,項目剛開始,我覺得先做好整體結構比較好。像是蓋樓一樣。先把樓體建造出來,然後再一步一步的美化完善。 基礎的倉儲模式已經ok,Autofa ...
  • 框架目標 什麼是框架,框架能做到什麼? 把一個方向的技術研發做封裝,具備通用性,讓使用框架的開發者用起來很輕鬆。 屬性: 通用性 健壯性 穩定性 擴展性 高性能 組件化 跨平臺 從零開始-搭建框架 建立項目 主鍵查詢功能開發 綁定實體 一步一步的給大家推導: 一邊寫一邊測試 從零開始--搭建框架 1 ...
  • 大家好,我是沙漠盡頭的狼。 本方首發於Dotnet9,介紹使用dnSpy調試第三方.NET庫源碼,行文目錄: 安裝dnSpy 編寫示常式序 調試示常式序 調試.NET庫原生方法 總結 1. 安裝dnSpy dnSpy是一款功能強大的.NET程式反編譯工具,可以對.NET程式進行反編譯,代替庫文檔的功 ...
  • 在`Windows`操作系統中,每個進程的虛擬地址空間都被劃分為若幹記憶體塊,每個記憶體塊都具有一些屬性,如記憶體大小、保護模式、類型等。這些屬性可以通過`VirtualQueryEx`函數查詢得到。該函數可用於查詢進程虛擬地址空間中的記憶體信息的函數。它的作用類似於`Windows`操作系統中的`Task... ...
  • 背景介紹 1,最近有一個大數據量插入的操作入庫的業務場景,需要先做一些其他修改操作,然後在執行插入操作,由於插入數據可能會很多,用到多線程去拆分數據並行處理來提高響應時間,如果有一個線程執行失敗,則全部回滾。 2,在spring中可以使用@Transactional註解去控制事務,使出現異常時會進行 ...
  • 線程(thread)是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際 運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以併發多個線程,每條線 程並行執行不同的任務。 ...
  • 發現Java 21的StringBuilder和StringBuffer中多了repeat方法: /** * @throws IllegalArgumentException {@inheritDoc} * * @since 21 */ @Override public StringBuilder ...