• C# ListBox 子项数据更新


    今天在倒腾ListBox控件的数据编辑时,遇到了一个小小的问题,现在就把解决方法记录下来,如果各位道友有更好的方法,一定要留言赐教。


    问题还原:

    有一个界面,有这么一个ListBox用来显示所有的角色信息:

    角色类的源代码如下,反正可以想象成任意自定义的类都可以:

        /// <summary>
        /// 单个角色对象
        /// </summary>
        public class RoleItem
        {
            #region Public Property
    
    
            /// <summary>
            /// 角色的唯一代码
            /// </summary>
            public string RoleCode { get; set; } = Guid.NewGuid().ToString("N");
    
            /// <summary>
            /// 角色名称
            /// </summary>
            public string RoleName { get; set; }
    
            /// <summary>
            /// 角色描述
            /// </summary>
            public string Description { get; set; }
    
            /// <summary>
            /// 关联的账户列表
            /// </summary>
            public List<string> Accounts { get; set; } = new List<string>();
    
    
            #endregion
            
            #region Object Override
    
            /// <summary>
            /// 返回对象的字符串标识形式
            /// </summary>
            /// <returns></returns>
            public override string ToString()
            {
                return RoleName;
            }
            
            #endregion
    
        }
    

      在控件加载的时候进行数据的初始化,这里不能使用datasouce来绑定数据源,不然不能修改单个的。下面的初始化也只是例子而已。

                    List<RoleItem> roles = new List<RoleItem>();// 假设已经获取到了数据
                    
                    foreach(var m in roles)
                    {
                        listBox1.Items.Add(m);
                    }
    

      在点击界面的编辑按钮时,获取listBox1的选中项。然后修改类中的RoleName 属性,所以正常的代码如下编写:

     private void userButton5_Click(object sender, EventArgs e)
            {
                if (listBox1.SelectedItem is RoleItem role)
                {
                    // 点击了编辑按钮并获取了需要修改的信息
                    role.RoleName = role.RoleName + "1";
                }
            }
    

      上述代码为示例,重要的是结果发现listBox1中的显示没有更新,然是数据确实更新了,但是即使调用了下面的三个刷新方法也是无济于事。

                            listBox1.Refresh();
                            listBox1.Invalidate();
                            listBox1.Update();
    

      但是我在调用listBox1.Items.Add(object obj)时却会自动更新,即使翻看微软的源代码,也没有找到哪里可以刷新显示的方法,源代码地址:

    http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/ListBox.cs,81e38e1c58b6d37c

           所以参数上述的Add方法可以刷新,也就是整个变量重新赋值也可以刷新,所以上述的编辑代码变更成了

     private void userButton5_Click(object sender, EventArgs e)
            {
                if (listBox1.SelectedItem is RoleItem role)
                {
                    // 点击了编辑按钮并获取了需要修改的信息
                    role.RoleName = role.RoleName + "1";
                    listBox1.Items[listBox1.SelectedIndex] = listBox1.Items[listBox1.SelectedIndex];
                }
            }
    

      暂时解决了方法,当点击按钮时,控件的界面也会跟着刷新,如果需要全部刷新,就要循环操作。

    这个问题来自开发一个简单通用的C-S架构的框架模版,地址为https://github.com/dathlin/ClientServerProject

  • 相关阅读:
    【Nginx学习】安装及常用命令
    【Nginx学习】基础知识
    【Nginx学习】Xshell7连接CentOS7艰难轶事
    【LeetCode刷题】5343. 多次求和构造目标数组:妙解
    【LeetCode刷题】1353. 最多可以参加的会议数目
    【转载】priority_queue用法
    【LeetCode刷题】供暖器:妙解
    【妙解】重复的子字符串
    【转载学习】基金理财学习
    【转载】sync_with_stdio + cin.tie
  • 原文地址:https://www.cnblogs.com/dathlin/p/7635900.html
Copyright © 2020-2023  润新知