今天在倒腾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

C# ListBox 子项数据更新的更多相关文章

  1. WPF:间接支持虚拟化的ListBox

    /// <summary> /// 间接实现了虚拟化的ListBox /// 子项必须实现IVisible接口 /// 你可以在IsVisible发生改变时实现一系列自定义动作 /// 比 ...

  2. 通通玩blend美工(6)下——仿iPhone滚动选择器的ListBox(交互逻辑)

    原文:通通玩blend美工(6)下--仿iPhone滚动选择器的ListBox(交互逻辑) 上一篇我们已经把界面画出来了,这篇我们就来制作交互的逻辑吧.上一篇的电梯: http://www.cnblo ...

  3. WPF|快速添加新手引导功能(支持MVVM)

    阅读导航 前言 案例一 案例二 案例三(本文介绍的方式) 如何使用? 控件如何开发的? 总结 1. 前言 案例一 站长分享过 眾尋 大佬的一篇 WPF 简易新手引导 一文,新手引导的效果挺不错的,如下 ...

  4. Template、ItemsPanel、ItemContainerStyle、ItemTemplate(包括ListBox的Item子项是横向排列)

    Template.ItemsPanel.ItemContainerStyle.ItemTemplate 分类: WPF2011-10-12 10:13 4716人阅读 评论(0) 收藏 举报 data ...

  5. WP8__实现ListBox横向滑动及子项绑定图片等控件

    <!--实现绑定的图片等信息 ListBox水平滚动--> <Grid> <Grid.Resources> <Style x:Key="horizo ...

  6. wpf ListBox 双击事件时在子项添加Style 确保选中

    <ListBox ItemTemplate="{StaticResource CardPictureTemplate}" VirtualizingPanel.CacheLen ...

  7. 自定义LISTBOX内子项为checkbox或者radio时,关于IsChecked绑定

    IsChecked="{Binding IsSelected, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}&q ...

  8. windows编程学习笔记(三)ListBox的使用方法

    ListBox是Windows中的一种控件,一般被当做子窗口使用,Windows中所有子窗口都是通过发送一个通知码到父窗口父窗口通过WM_COMMAND消息接收,并在此消息中处理,并控制子窗口,Lis ...

  9. #400 – 使用ItemsPanel 属性将WrapPanel 作为ListBox的显示面板(Using a WrapPanel as the Items Panel for a ListBox)

    原文:#400 – 使用ItemsPanel 属性将WrapPanel 作为ListBox的显示面板(Using a WrapPanel as the Items Panel for a ListBo ...

随机推荐

  1. Python多版本共存管理工具之pyenv

    目录 Table of Contents 1. 安装pyenv 2. 安装Python 3.0 使用python 参考 Table of Contents 经常遇到这样的情况: 系统自带的Python ...

  2. Jenkins 集成Ansible教程

    前提条件: 1. 部署Jenkins Server 2. 部署 Ansible Server 一.在Jenkins安装SSH插件 系统管理 -> 插件管理 二.在Jenkins 凭证中添加Ans ...

  3. bat(续六)-windows批处理set命令

    windows批处理set命令 [设置变量]格式:set 变量名=变量值详细:被设定的变量以%变量名%引用 [取消变量]格式:set 变量名=详细:取消后的变量若被引用%变量名%将为空 [展示变量]格 ...

  4. 从零开始玩转JMX(二)——Condition

    Notification 一个MBean提供的管理接口允许代理对其管理资源进行控制和配置.然而,对管理复杂的分布式系统来说,这些接口知识提供了一部分功能.通常,管理应用程序需要对状态变化或者当特别情况 ...

  5. Spring IOC 源码解析(持续)

    如何查看源码 Spring源码下载https://github.com/spring-projects/spring-framework/tags?after=v3.1.0.RC1 eclipse关联 ...

  6. Mac OS build caffe2 Error:This file was generated by an older version of protoc which is

    问题所在 我们可以发现这个错误跟protobuf的版本有关,因此我们可以执行script/diagnose_protobuf.py 我们可以看到,pip install protobuf 和 brew ...

  7. 解题报告:codeforce 7C Line

    codeforce 7C C. Line time limit per test1 second memory limit per test256 megabytes A line on the pl ...

  8. Centos环境下,执行gulp,显示执行成功,但找到不生成的压缩文件

    举例来说:以下是css文件夹下site.css文件为site.min.css,并且将生成的文件放在指定的目录下 //压缩站点css gulp.task('appallcss', function () ...

  9. 关于Visual Studio 2010自动添加头部注释信息

    作为一个万年潜水党,不关这一篇文章技术含量如何,也算是一个好的开始吧.   在日常的开发中我们经常需要为类库添加注释和版权等信息,这样我们就需要每次去拷贝粘贴同样的文字,为了减少这种重复性的工作,我们 ...

  10. nmap 端口扫描王,查看端口是否可访问,是否对外开放

    NMap,也就是Network Mapper,最早是Linux下的网络扫描和嗅探工具包. 1 安装 apt-get install nmap 2 使用,查看ip下所有对外的端口 $ sudo nmap ...