使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件

这篇具有很好参考价值的文章主要介绍了使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在一些字典绑定中,往往为了方便展示详细数据,需要把一些结构树展现在树列表TreeList控件中或者下拉列表的树形控件TreeListLookUpEdit控件中,为了快速的处理数据的绑定操作,比较每次使用涉及太多细节的操作,我们可以把相关的数据绑定操作,放在一些辅助类的扩展函数中进行处理,这样可以更方便的,更简洁的处理数据绑定操作,本篇随笔介绍TreeList控件和TreeListLookUpEdit控件在扩展函数中的处理操作。

1、TreeList控件的绑定操作

TreeList本身就是一个树形数据的展示控件,可以展示常规的二维表,也可以展示具有嵌套关系的二维表,数据源可以是多种方式的,支持Datable的数据源的嵌套展示。

单个列信息的树形列表展示界面效果:

使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件

 类似GridView的嵌套列表展示的TreeList界面效果

使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件

 这些界面都比较常见,也是我们经常碰到的处理效果,但是TreeList的界面设置有很多特性,如果每次拷贝这些代码,需要很多,也不便于维护,因此我们建立一些扩展函数来处理界面元素的绑定,就非常必要。

使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件

本篇随笔介绍基于TreeList和TreeListLookUpEdit控件的绑定即可。两个类型控件的数据源,都可以是DataTable类型,也可以是IList集合类型,如下所示是基于SQLSugar开发框架,返回的数据结构是IList类型的。

使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件

所以一般树形列表的绑定操作,提供一个方法来获取数据并绑定即可。

        /// <summary>
        /// 绑定树的数据源
        /// </summary>
        private async void BindTree()
        {
            var list = await BLLFactory<IDictTypeService>.Instance.GetAllAsync();
            this.tree.DataSource = list?.Items;
            this.tree.ExpandAll();
        }

如果使用原生代码初始化树列表,那么代码如下所示。

 //使用原生代码处理
 //添加显示列
 this.tree.Columns.Add(new TreeListColumn{ FieldName= "Id", Caption= "ID"});//增加一个隐藏的字段,存储需要的ID
 this.tree.Columns.Add(new TreeListColumn{ FieldName= "Name", Caption= "字典类型名称", Width=160, VisibleIndex =0});
 //设置树控件的层次关系及属性
 tree.KeyFieldName = "Id";
 tree.ParentFieldName = "PID";
 this.tree.OptionsBehavior.Editable = false;
 this.tree.OptionsView.ShowColumns = false;
 this.tree.OptionsView.ShowCheckBoxes = false;
 this.tree.OptionsView.EnableAppearanceOddRow = true;
 this.tree.OptionsView.EnableAppearanceEvenRow = true;

而实现查询过滤的操作,还需要另外处理代码,我们看看大概的代码如下。

        /// <summary>
        /// 实现树节点的过滤查询
        /// </summary>
        private void InitSearchControl()
        {
            this.searchControl1.Client = this.tree;
            this.tree.FilterNode += (object sender, FilterNodeEventArgs e) =>
            {
                if (tree.DataSource == null)
                    return;

                string nodeText = e.Node.GetDisplayText("Name");//参数填写FieldName  
                if (string.IsNullOrWhiteSpace(nodeText))
                    return;

                bool isExist = nodeText.IndexOf(searchControl1.Text, StringComparison.OrdinalIgnoreCase) >= 0;
                if (isExist)
                {
                    var node = e.Node.ParentNode;
                    while (node != null)
                    {
                        if (!node.Visible)
                        {
                            node.Visible = true;
                            node = node.ParentNode;
                        }
                        else
                            break;
                    }
                }
                e.Node.Visible = isExist;
                e.Handled = true;
            };
        }

这些是比较常见的操作,我们把它封装为扩展函数,然后根据特性传入对应参数实现即可。

最后简单的三行代码来简单处理,可以达到同样的效果就可以了。

  //控件扩展函数封装处理
  this.tree.CreateColumn("Name", "字典类型名称", 160, true);
  this.tree.InitTree("Id", "PID", "-1", false, false);
  this.tree.InitSearchControl(this.searchControl1, "Name");

我们扩展方法放在一个单独的文件中,标注为静态类即可。

    /// <summary>
    /// TreeList控件的扩展函数
    /// </summary>
    public static class TreeList_Extension

其中提供几个对TreeList 常见的封装处理方法就可以了。

使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件

对于一些不常见的属性,我们保留它即可,如下界面代码是对TreeList绑定展示多个列的处理操作。

/// <summary>
/// 初始化TreeList控件,展现嵌套的列表。
/// </summary>
private void InitControl()
{
    this.tree.Columns.Clear();//控件扩展函数封装处理
    this.tree.CreateColumn("Name", "机构名称", 160, true);
    this.tree.CreateColumn("HandNo", "机构编码", 80, true);
    this.tree.CreateColumn("Category", "机构分类", 80, true);
    this.tree.CreateColumn("Address", "机构地址", 160, true);
    this.tree.CreateColumn("InnerPhone", "内线电话", 80, true);
    this.tree.CreateColumn("OuterPhone", "外线电话", 80, true);
    this.tree.CreateColumn("SortCode", "排序码", 80, true);
    this.tree.InitTree("Id", "PID", null, true, true);

    this.tree.OptionsView.RowImagesShowMode = RowImagesShowMode.InCell;//紧凑型图标
    this.tree.ExpandAll();

    // 列过滤处理            
    this.tree.OptionsView.ShowAutoFilterRow = true;//显示过滤行            
    this.tree.OptionsBehavior.EnableFiltering = true;//开启过滤功能

    //初始化树节点选择事件
    this.tree.FocusedNodeChanged += delegate (object sender, FocusedNodeChangedEventArgs e)
    {
        this.FocusedNodeChanged();
    };
    //树节点双击处理事件
    this.tree.DoubleClick += (s, e) =>
    {
        if (this.tree.FocusedNode != null)
        {
            string ID = string.Concat(this.tree.FocusedNode.GetValue("Id"));
            MessageDxUtil.ShowTips("Id=" + ID);
        }
    };
    //编辑记录失去焦点后校验处理
    this.tree.ValidateNode += (s, e) =>
    {
        Console.WriteLine(this.tree.FocusedNode.GetValue("Name"));
    };
}

实现类似GridView的嵌套列表展示的TreeList界面效果如下所示。

使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件

 文章来源地址https://www.toymoban.com/news/detail-425003.html

2、TreeListLookUpEdit控件绑定操作

在一些参考的列表中,我们往往需要展示更丰富一点的列表内容,如下所示。

使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件

使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件

如果有嵌套列表的,展示嵌套列表的处理

使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件

对于下拉的树形列表,虽然这个控件比TreeList更复杂一些,它是下拉列表和TreeList的整合体,不过我们也可以用类似的扩展函数方法,来简单的实现数据的绑定展示。

如对于常规的数据绑定,我们大概的代码如下所示。

//TreeListLookupEdit数据绑定
//this.txtProjectList3.Properties.TreeList.OptionsView.ShowCheckBoxes = true;
this.txtProjectList3.Properties.DataSource = list;
this.txtProjectList3.Properties.ValueMember = "Value";
this.txtProjectList3.Properties.DisplayMember = "Text";
this.txtProjectList3.Properties.TreeList.Columns.Clear();
for (int i = 0; i < columns.Count; i++)
{
    this.txtProjectList3.Properties.TreeList.CreateColumn(columns[i].FieldName, columns[i].Caption,
        columns[i].Width, true);
}
this.txtProjectList3.Properties.TreeList.InitTree(null, null, null, true, true);

this.txtProjectList3.Properties.ImmediatePopup = true;
this.txtProjectList3.Properties.TextEditStyle = TextEditStyles.Standard;
this.txtProjectList3.Properties.PopupWidthMode = DevExpress.XtraEditors.PopupWidthMode.ContentWidth;
this.txtProjectList3.Properties.PopupFormSize = new System.Drawing.Size(this.txtProjectList3.Width, 300);
this.txtProjectList3.Properties.TreeList.IndicatorWidth = 40;
this.txtProjectList3.Properties.TreeList.CustomDrawNodeIndicator += (s, ee) =>
{
    if (ee.IsNodeIndicator)
    {
        var index = ee.Node.TreeList.GetVisibleIndexByNode(ee.Node);
        ee.Info.DisplayText = (index + 1).ToString();
    }
};

对于常规的列表绑定,我们可以用简单的一个扩展函数实现,如下所示。

    //常规类别绑定
    this.txtProjectList4.BindDictItems(list, "Text", "Value", true, columns.ToArray());

就可以实现常规的界面效果处理。

使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件

对于树形列表,我们需要设置属性的ID和PID,以及一些显示的列属性,那么也可以增加更多的参数来实现。

var dictTypeColumns = new List<LookUpColumnInfo>()
{
    new LookUpColumnInfo("Id", "Id"),
    new LookUpColumnInfo("Name", "字典类别名称")
};
treeListLookUp.BindDictItems(result.Items, "Name", "Id", true, false, "Id", "PID", null, true, true, true, false, dictTypeColumns.ToArray());

因此嵌套列表就可以正常的展示出层次关系了

使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件

因此我们把扩展方法,放到静态类里面就可以了,方法封装如下所示

       /// <summary>
        /// 绑定TreeListLookUpEdit控件的数据源(完整版)
        /// </summary>
        /// <param name="lookup">控件对象</param>
        /// <param name="dataSource">数据源</param>
        /// <param name="displayMember">显示字段</param>
        /// <param name="valueMember">值字段</param>
        /// <param name="showRowIndicator">是否显示序号</param>
        /// <param name="showCheckbox">是否显示复选框</param>
        /// <param name="keyFieldName">设置父子递归关系字段-子字段,不指定则使用valueMember</param>
        /// <param name="parentFieldName">设置父子递归关系字段-父字段,不指定则不嵌套展示</param>
        /// <param name="rootValue">根节点的值</param>
        /// <param name="editable">树节点是否可以编辑</param>
        /// <param name="showColumnHeader">是否显示列头</param>
        /// <param name="oddEvenRowColor">是否奇偶行不同颜色</param>
        /// <param name="allowDrop">是否运行拖动列</param>
        /// <param name="lookUpColumnInfos">显示的列</param>
        /// <returns></returns>
        public static object BindDictItems(this TreeListLookUpEdit lookup, object dataSource, string displayMember, string valueMember, bool showRowIndicator = true,
            bool showCheckbox = false, string keyFieldName = null, string parentFieldName = null, string rootValue = null, bool editable = true,
            bool showColumnHeader = false, bool oddEvenRowColor = true, bool allowDrop = false,
            params LookUpColumnInfo[] lookUpColumnInfos)
        {
            lookup.Properties.DataSource = dataSource;
            lookup.Properties.DisplayMember = displayMember;
            lookup.Properties.ValueMember = valueMember;
            lookup.Properties.TreeList.OptionsView.ShowCheckBoxes = showCheckbox;

            lookup.Properties.TreeList.Columns.Clear();
            for (int i = 0; i < lookUpColumnInfos.Length; i++)
            {
                lookup.Properties.TreeList.CreateColumn(lookUpColumnInfos[i].FieldName, lookUpColumnInfos[i].Caption,
                    lookUpColumnInfos[i].Width, true);
            }

            //初始化树的样式和特性
            //keyFieldName = !string.IsNullOrWhiteSpace(keyFieldName) ? keyFieldName : valueMember;//如果不指定,采用valueMember
            lookup.Properties.TreeList.InitTree(keyFieldName, parentFieldName, rootValue, editable, showColumnHeader, oddEvenRowColor, allowDrop);
            lookup.Properties.PopupFormSize = new System.Drawing.Size(lookup.Width, 300);

            lookup.Properties.ImmediatePopup = true;
            lookup.Properties.TextEditStyle = TextEditStyles.Standard;

            if (showRowIndicator)
            {
                lookup.Properties.TreeList.IndicatorWidth = 40;
                //重写序号显示,默认不显示数值
                lookup.Properties.TreeList.CustomDrawNodeIndicator += (s, ee) =>
                {
                    if (ee.IsNodeIndicator)
                    {
                        var index = ee.Node.TreeList.GetVisibleIndexByNode(ee.Node);
                        ee.Info.DisplayText = (index + 1).ToString();
                    }
                };
            }

            return dataSource;
        } 

通过扩展方法的方式,可以简化界面的处理代码,同时利于我们在项目开发的时候,快速的实现相关的效果,而不需要过多的中断查找相关的界面控件属性。

有几篇类似的文章,可供参考:

《在Winform开发中,我们使用的几种下拉列表展示字典数据的方式》

《在Winform开发框架中下拉列表绑定字典以及使用缓存提高界面显示速度》

《在各种开发项目中使用公用类库的扩展方法,通过上下文方式快速调用处理函数》

 

到了这里,关于使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# winform控件和对象双向数据绑定

    实现目的: 控件和对象双向数据绑定 实现结果: 1. 对象值 - 控件值 2. 控件值 - 对象值

    2024年02月10日
    浏览(40)
  • 界面控件Telerik UI for WinForms使用指南 - 数据绑定 & 填充(一)

    Telerik UI for WinForms拥有适用Windows Forms的110多个令人惊叹的UI控件,所有的UI for WinForms控件都具有完整的主题支持,可以轻松地帮助开发人员在桌面和平板电脑应用程序提供一致美观的下一代用户体验。 Telerik UI for WinForms组件为可视化任何类型的数据提供了非常丰富的UI控件,其

    2023年04月27日
    浏览(55)
  • 【Jetpack】DataBinding 架构组件 ③ ( 使用 include 导入二级界面布局 | 二级页面绑定数据模型 )

    如果在 DataBinding 布局 中 , 通过 include 引入了其它布局 , 数据模型对象 需要 绑定到 通过 include 引入的二级页面 布局文件中 ; 在上一篇博客 【Jetpack】DataBinding 架构组件 ② ( 字符串拼接函数 | 绑定点击事件函数 | DataBinding 布局中使用 import 标签导入 Java、Kotlin 类 ) 的示例中

    2023年04月08日
    浏览(46)
  • Winform中使用HttpClient(设置最大超时响应时间)调用接口并做业务处理时界面卡住,使用async Task await异步任务编程优化

    Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类: Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类_winform请求http接口_霸道流氓气质的博客-CSDN博客 参考前面使用HttpClient调用http的get和post接口的小示例, 需要定

    2024年02月02日
    浏览(54)
  • C# winform中ComboBox两种数据绑定的方法及其效率

                list相对于DataTable消耗的时长要少

    2024年02月11日
    浏览(43)
  • <Python>PyQt5中UI界面和逻辑函数分开写的一种方式

    前言 如果经常使用PyQt5这种模块来编写带UI界面的程序,那么很自然的就会涉及到,一旦程序比较大,UI控件多的时候,需要将UI和逻辑程序分离,这样方便管理,也方便维护。 配置: 平台:windows 工具:visual studio code 语言:python 库:PyQt5 本文将提供一个简单但可用的实例,

    2024年02月02日
    浏览(51)
  • UE4 -使用快捷方式添加命令行参数启动项目

    命令行参数(Command-Line Arguments) 是各类称之为的字符串,当运行可执行文件时可以通过命令行或者可执行文件的快捷方式将其传入。它们的目的是自定义引擎运行的方式,以便符合开发人员或用户的需要。这可以像使得运行编辑器而不运行游戏那么简单;或它也可以更

    2024年02月07日
    浏览(46)
  • 界面控件DevExpress WinForm——属于WinForm组件的MVVM框架

    DevExpress WinForm拥有180+组件和UI库,能为 Windows Forms 平台创建具有影响力的业务解决方案。 DevExpress WinForm 能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任! 注意 :DevExpress WinForm v22.2已经正式发布,新版

    2023年04月09日
    浏览(44)
  • 使用Shell为UOS中的所有用户创建网页的快捷方式

    本脚本通过域管下发默认为root权限执行   #!/bin/bash cd /home #快捷方式图标名称 string_imgName=\\\"temp1.png\\\" #快捷方式文件名称 string_fileName=\\\"/changePassword.desktop\\\" #快捷方式内容 function insertInfo() { cat $1$string_fileName EOF [Desktop Entry] #快捷方式名称 Name=修改密码双击此处 #描述 Comment=修改密码

    2024年02月08日
    浏览(38)
  • 第四篇 用户登录界面(WinForm版本)

    本编文章来教大家如何创建WinForm项目,以及如何使用WinForm创建自己的登录界面 1、新建项目,打开VS开发工具,创建新项目,选择Windows窗体应用(.Net Framework)。    2、输入项目名称,项目名称建议使用英文名称,避免后面因中文产生的各种异常错误,选择自己电脑上的项目存

    2024年02月09日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包