首页 > 其他分享 >在DevExpress的GridView的列中,使用RepositoryItemSearchLookUpEdit控件实现产品列表信息的展示和选择

在DevExpress的GridView的列中,使用RepositoryItemSearchLookUpEdit控件实现产品列表信息的展示和选择

时间:2023-06-05 18:11:52浏览次数:61  
标签:grv 控件 GridView DevExpress LookUpColumnInfo FieldName new CreateColumn

有时候,我们为了方便,我们往往使用扩展函数的代码方式创建很多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控件实现产品列表信息的展示和选择的操作,希望能够给你提供参考的思路。

标签:grv,控件,GridView,DevExpress,LookUpColumnInfo,FieldName,new,CreateColumn
From: https://www.cnblogs.com/wuhuacong/p/17458627.html

相关文章

  • WPF.Basic.样式基础及控件模板
    合集-WPF从入门到放弃(3)1.WPF入门笔记-01-入门基础以及常用布局05-202.WPF入门笔记-02-布局综合应用05-283.WPF入门笔记-03-样式基础及控件模板06-03收起......
  • [MAUI程序设计] 用Handler实现自定义跨平台控件
    @目录Handler与Xamarin.Forms实现的区别为什么要用Handler代替Renderer解耦生命周期管理更细粒度的控制用Effect来实现呢?自定义手势监听控件在各平台上实现TouchRecognizeriOS中的实现Android中的实现Windows中的实现创建控件使用控件最终效果项目地址今天来谈一谈MAUI跨平台技术......
  • Flutter灵活布局要掌握的两个控件Expanded和Flexible
    Expanded和Flexible介绍在Flutter中,Expanded和Flexible是两个用于控制子组件尺寸的Widget,它们都可以用于实现灵活的布局。ExpandedWidget会自动将子组件的尺寸扩展到父组件剩余的空间,而FlexibleWidget则会自动调整子组件的尺寸以适应父组件的尺寸。具体来说,ExpandedWidget......
  • WPF 入门笔记 - 03 - 样式基础及控件模板
    ......
  • WPF中的Image控件上传,保存,显示头像
    WPF中的Image控件上传,保存,显示头像//选择电脑上的图片显示到Image控件中privatevoidbtnUpload_Click(objectsender,RoutedEventArgse){//打开文件对话框以选择要上传的图片OpenFileDialogopenFileDialog=newOpenFi......
  • c# winfrom中 dateTimePicker 控件设置自动获取上个月,当月,下个月,前好几个月,后好几个月
    我这里用的是vs2022开发,将获取的时间赋值给dateTimePicker控件进行筛选1、从工具箱中托取一个dateTimePicker控件,我这里将该控件命名为RQ,代码为RQ.value=时间代码2、时间的获取:今天:RQ.Value=DateTime.Now;本月第一天:RQ.Value=DateTime.Now.AddDays(1-DateTime.Now.Day......
  • flutter-基础控件
    资料Flutter控件之ScaffoldWidgetScaffoldScaffold有下面几个主要属性:appBar:显示在界面顶部的一个AppBar,也就是Android中的ActionBar、Toolbarbody:当前界面所显示的主要内容WidgetfloatingActionButton:纸墨设计中所定义的FAB,界面的主要功能按钮persistentFooterButtons:固......
  • 利用Flutter的LayoutBuilder、BoxConstraints创建自适应布局控件
    简介在Flutter中,LayoutBuilder是一个Widget,用于构建一个包含父组件约束的子组件。它可以获取父组件的约束信息并将其传递给子组件进行布局。LayoutBuilder的主要作用是让子组件根据父组件的大小进行自适应布局。LayoutBuilder的作用是在子控件构建之前获取父级容器的大小,并将其传......
  • 界面组件DevExpress WPF中文指南 - 如何应用系统强调色及主题切换
    在最新版本的MicrosoftOffice产品中,用户可以根据系统设置选择主题,当使用这个主题时,Office将采用Windows强调色和应用模式(亮/暗)设置,并将它们应用到Office本身。如果用户在操作系统中更改了强调色或应用模式,Office会检测到此更改并自动更新应用程序的外观。使用DevExpressWPF ......
  • Layout()方法用于布局管理器的更新,解决panel刷新后其中控件挤作一坨的问题
    在wxPython中,Layout()方法用于布局管理器的更新。它会告诉布局管理器重新计算和调整子控件的大小和位置。一般来说,当您:-添加或删除子控件-隐藏或显示子控件-改变子控件的大小-改变容器的大小这些情况下,您需要调用Layout()方法,告诉布局管理器进行重新布局。例如,在BoxSiz......