今天在倒腾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. 同余定理简单应用 - poj2769 - hdu 1021 - hdu 2035

    同余问题 基本定理: 若a,b,c,d是整数,m是正整数, a = b(mod m), c = d(mod m) a+c = b+c(mod m) ac = bc(mod m) ax+cy = bx+ ...

  2. poj 3461 - Oulipo 经典kmp算法问题

    2017-08-13 19:31:47 writer:pprp 对kmp算法有了大概的了解以后,虽然还不够深入,但是已经可以写出来代码,(可以说是背会了) 所以这道题就作为一个模板,为大家使用吧. 题 ...

  3. codeforces600E Lomsat gelral

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  4. 数据可视化——Matplotlib(1)

    导入相关模块 import matplotlib.pyplot as plt import pandas as pd import numpy as np 基本图表 散点图:scatter N = 1 ...

  5. nignx的master进程和worker进程的作用

    ngnix进程启动启动后会有一个master进程和多个worker进程. master进程的主要作用: 1.读取并验证配置信息: 2.创建,绑定及关闭套接字: 3.启动,终止worker进程以及维护w ...

  6. java实现赋值excel模板,并在新文件中写入数据,并且下载

    /** * 生成excel并下载 */ public void exportExcel(){ File newFile = createNewFile(); //File newFile = new ...

  7. findContours函数参数详解

    http://blog.csdn.net/dcrmg/article/details/51987348

  8. c# 计算中文字节数与JAVA不符的解决方法

    c# 中方法 string str = "中华人民共和国"; int strLen = System.Text.Encoding.Default.GetByteCount(str) ...

  9. Calendar时间获取天,周,月,季度,年度时间段

    Date类 Date类的大多数构造函数和方法都已经抛弃,只留下和毫秒有关的操作,目前常用的构造函数 常用方法 设置毫秒数 读取毫秒数 toString()打印结果 //创建日期对象,把当前的毫秒值转成 ...

  10. B-Tree和B+Tree

    目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构,在本文的下一节会结合存储器原理及计算机存取原理讨论为什么B-Tree和B+Tree在被如此广泛用于索引,这一节先单纯从 ...