强制绑定到数据源的复选框在尚未查看时更新

2024-06-28

这是一个测试框架来展示我正在做的事情:

  1. 创建一个新项目
  2. 添加选项卡式控件
  3. 在选项卡 1 上放置一个按钮
  4. 在选项卡 2 上放置一个复选框
  5. 粘贴此代码作为其代码

(使用控件的默认名称)

public partial class Form1 : Form
{
    private List<bool> boolList = new List<bool>();
    BindingSource bs = new BindingSource();
    public Form1()
    {
        InitializeComponent();
        boolList.Add(false);
        bs.DataSource = boolList;
        checkBox1.DataBindings.Add("Checked", bs, "");
        this.button1.Click += new System.EventHandler(this.button1_Click);
        this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);

    }
    bool updating = false;
    private void button1_Click(object sender, EventArgs e)
    {
        updating = true;
        boolList[0] = true;
        bs.ResetBindings(false);
        Application.DoEvents();
        updating = false;
    }

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        if (!updating)
            MessageBox.Show("CheckChanged fired outside of updating");
    }
}

问题是,如果您运行程序并查看选项卡 2,然后按选项卡 1 上的按钮,程序将按预期工作,但是,如果您按选项卡 1 上的按钮,然后查看选项卡 2,则复选框的事件将不会触发,直到您按下查看选项卡 2。

原因是选项卡 2 上的控件未处于“已创建”状态,因此只有在该控件“已创建”之后,才会发生将复选框从未选中更改为已选中的绑定。

checkbox1.CreateControl() 不执行任何操作,因为根据MSDN http://msdn.microsoft.com/en-us/library/system.windows.forms.control.createcontrol.aspx?queryresult=true

CreateControl 不创建 控制句柄,如果控件的 可见财产是假的。你可以 调用 CreateHandle 方法或 访问 Handle 属性来创建 控件的句柄,无论 控件的可见性,但在此 情况下,没有创建窗口句柄 对于控件的孩子。

我尝试获取 Handle 的值(没有publicCreateHandle() for CheckBox) 但结果仍然相同。

除了让程序在首次加载时快速刷新所有具有数据绑定复选框的选项卡之外,还有什么建议吗?

编辑 - 根据 Jaxidian 的建议我创建了一个新课程

public class newcheckbox : CheckBox
{
    public new void CreateHandle()
    {
        base.CreateHandle();
    }
}

我在之后立即调用 CreateHandle()updating = true与之前的结果相同。


我想我有一个解决方案。问题不在于您无法创建句柄。您只需访问控件上的 Handle get 访问器即可做到这一点。问题是 WinForms 不会创建该控件,因为它不可见。事实证明,在幕后,System.Windows.Forms.Control有两个重载CreateControl。第一个是公共的,不带任何参数,它调用第二个internal这需要一个boolean参数:ignoreVisible,顾名思义,它允许调用代码创建控件,即使它不可见。这CreateControl不带参数的方法将 false 传递给此内部方法,这意味着如果控件不可见,则不会创建它。所以,技巧就是使用Reflection来调用内部方法。首先,我创建了两种创建控件的方法:

private static void CreateControls( Control control )
{
    CreateControl( control );
    foreach ( Control subcontrol in control.Controls )
    {
        CreateControl( subcontrol );
    }
}
private static void CreateControl( Control control )
{
    var method = control.GetType().GetMethod( "CreateControl", BindingFlags.Instance | BindingFlags.NonPublic );
    var parameters = method.GetParameters();
    Debug.Assert( parameters.Length == 1, "Looking only for the method with a single parameter" );
    Debug.Assert( parameters[0].ParameterType == typeof ( bool ), "Single parameter is not of type boolean" );

    method.Invoke( control, new object[] { true } );
}

现在,我们添加一个调用CreateControls对于第二个选项卡:

public Form1()
{
    InitializeComponent();
    boolList.Add( false );
    bs.DataSource = boolList;
    checkBox1.DataBindings.Add( "Checked", bs, "" );
    this.button1.Click += this.button1_Click;
    this.checkBox1.CheckedChanged += this.checkBox1_CheckedChanged;

    CreateControls( this.tabPage2 );
}

此外,我添加了一些调试消息,以便我可以查看事件是否已触发:

private void button1_Click( object sender, EventArgs e )
{
    Debug.WriteLine( "button1_Click" );
    updating = true;
    boolList[0] = true;
    bs.ResetBindings( false );
    Application.DoEvents();
    updating = false;
}

private void checkBox1_CheckedChanged( object sender, EventArgs e )
{
    Debug.WriteLine( "checkBox1_CheckedChanged" );
    if ( !updating )
    {
        Debug.WriteLine( "!updating" );
        MessageBox.Show( "CheckChanged fired outside of updating" );
    }
}

现在,无论您是否导航到第二个选项卡,单击第一个选项卡上的按钮都会触发checkbox1_Changed事件程序。鉴于您提供的设计,如果您单击该按钮,它将不会显示 MessageBox,因为updating将会是真的。但是,那Debug.WriteLine将在输出窗口中显示它已触发。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

强制绑定到数据源的复选框在尚未查看时更新 的相关文章

  • C# 在 WebBrowser 中调用 JavaScript

    我正在尝试调用 JavaScript 方法WebBrowser WebBrowser webBrowser new WebBrowser webBrowser NavigateToString html webBrowser LoadCom
  • 如何终止从cin读取?

    我已经尝试了这里列出的一堆方法 但没有一个起作用 它总是在等待更多的输入 我试过了while std getline std cin line 和下面的方法 似乎没有任何作用 include
  • 在运行时更改语言的正确方法

    在运行时更改表单语言的正确方法是什么 使用递归手动设置所有控件 例如this https stackoverflow com questions 7556367 how do i change the culture of a winfor
  • 如何获取picturebox非公开成员的值?

    我需要从 picturebox 的非公共成员获取图像矩形的值 如何获得该值 提前致谢 这是使用反射获取值的方法 PropertyInfo pInfo pictureBox1 GetType GetProperty ImageRectangl
  • 将 .net 上的 AWS 开发工具包与 localstack 结合使用(TransferUtility/S3 - 设置端点)

    我有本地堆栈 https github com localstack localstack https github com localstack localstack 正在运行 并且能够使用 aws s3 cli 将文件上传到其中 我想要
  • 是否有合法的方法使用运算符 << 打印元组和对?

    我有一组模板 函数 允许我打印元组 对 假设元组 对中的每种类型都有operator lt lt 为其定义的 不幸的是 由于 17 4 3 1 添加我的内容是非法的operator lt lt 重载到std 有没有其他方法可以让 ADL 找
  • 可以取消链接以读写方式打开的文件

    在我的程序 在 Mac OS X 上 中 我使用以下代码打开该文件 int fd fd open filename O RDWR 删除文件的程序如下 unlink filename 就我而言 我有相同的文件被打开和删除 我观察到以下情况 打
  • C 中的 const 和指针

    将 const 与指针一起使用可能会导致指针对象无法通过使用相关指针取消引用来修改 但为什么我也不能修改指针不直接指向的内容呢 例如 int a 3 const int ptr a ptr 5 不会编译 但为什么 ptr 2 5 还编译不了
  • 动态方法的实际例子?

    我想学习动态方法及其使用 C 的实际示例 动态方法和Reflection有什么关系吗 请帮我 我们正在使用动态方法来加速反射 这是我们的反射优化器的代码 只比直接调用慢10 比反射调用快2000倍 public class Reflecti
  • SQL:使用 1 个查询更新一行并返回列值

    我需要更新表中的一行 并从中获取列值 我可以这样做 UPDATE Items SET Clicks Clicks 1 WHERE Id Id SELECT Name FROM Items WHERE Id Id 这会生成 2 个对该表的计划
  • 当我更新具有相同数据类型的另一个列表时列表发生更改

    我的代码看起来像这样 public class Category public string CatId get set public string CatName get set public string SpecId get set
  • 如何搜索来自另一个页面模型的串联名称列表?

    我的项目中有多个模型 但在下面的屏幕中 大多数字段 属性都位于 SecurityLog 模型中 下面是我显示的官员串联列表 除了军官姓名之外 我的搜索和列标题排序功能正常 我很难合并官员姓名 因为该列表来自另一个页面模型 这是我的数据库架构
  • IE8固定标题,可滚动GridView

    我知道有人问过这个话题 但这些帖子都已经过时了 或者在 IE8 上不起作用 简而言之 我们基本上想要在 GridView 中对列标题进行 Excel 样式锁定 我见过几个解决方案 其中一个 jquery css setExpression
  • 同一个盒子上的进程间通信 - 2 个应用程序或进程之间的通信

    在同一机器上的应用程序之间实现进程间通信的最佳方法是什么 两者都是用 C 编写的 管理器应用程序将向其他应用程序发送命令 例如 停止 启动 它还将监视应用程序并可能要求提供数据 所有应用程序都将在同一台运行 Windows 7 操作系统的计
  • C#:迭代数据表:Rows、Select() 或 AsEnumerable()

    foreach DataRow row in myDataTable Select foreach DataRow row in myDataTable AsEnumerable foreach DataRow row in myDataT
  • C# 中线程之间发送消息

    如何在线程之间发送和接收消息 例如 一种解决方案是共享并发队列 尽管它的名称 并发队列 http msdn microsoft com en us library dd267265 aspx 这将允许您将一个对象从一个线程入队 并让另一个线
  • 配置 SourceTrail 以接受带有 @ 语法的嵌入式 c/c++ 头文件

    我正在尝试使用 Sourcetrail https www sourcetrail com https www sourcetrail com 快速了解 pic18 系列微控制器的一些旧嵌入式 c c 源代码 导入硬件包含文件时出现错误 该
  • 如何在 c#.net 中将十进制转换为 ASCII?

    谁能帮助我如何使用 C net 将十进制转换为 ASCII 当我在文本框 1 中输入小数时 单击 转换 按钮后 结果将显示在文本框 2 中 我的问题是如何将十进制转换为 ASCII 的代码 这个怎么做 这是我在网上找到的一个简单的解决方案
  • ASP.NET Core处理JSON反序列化问题

    我想更改 ASP NET Core 中无效 JSON 请求处理的默认行为 我有这个模型 public class Model public Guid Id get set 当我用这个 body 发送这个请求时 Id null 它返回此错误消
  • 类内枚举前向声明是否可能? [复制]

    这个问题在这里已经有答案了 我知道在 C 11 中可以转发声明枚举类型 如果提供了存储类型 例如 enum E short void foo E e enum E short VALUE 1 VALUE 2 但我想转发声明一个类中定义的枚举

随机推荐

  • 如何从请求中放入自定义范围/上下文(JobScoped - 自定义 CDI 范围)特定实例以使其可注入?

    简而言之 我想将剩余请求中的配置类的特定实例放入自定义范围中 主要问题是自定义范围 来自 JBeret 的 JobScopedhttps jberet gitbooks io jberet user guide content custom
  • 使用 VBA 在 Excel 工作表中添加验证列表时出现问题

    我有一个 Excel 工作表 其中加载了动态数据结果集 加载所有数据后 我需要在每行末尾添加 是 否 下拉列表 我必须动态地执行此操作 因为我事先不知道结果集的大小 以下代码抛出 应用程序定义或对象定义的错误 Dim firstRow As
  • vsprintf 和 va_list 的平台不一致

    背景 我目前正在尝试 扩展 标准 C 格式以支持处理特定结构 类似于 Objective C 扩展 C 格式以允许支持带有 序列的 NSString 我正在努力解决的一个问题是 vsprintf 在 OS X 和 Linux 上的行为似乎有
  • 模块中的属性

    有没有办法在 TypeScript 中定义属性module 这些都不能编译 module My doesnt work get Value number return 42 doesn t work either get function
  • Kinect 用户检测

    我正在开发一个应用程序 当 kinect 传感器检测到一个人可以在其上工作的骨架时 如果其他人靠近现有用户 它会检测到第二个人 我想限制用户 kinect 传感器首先检测到它 如果其他用户出现 则不应检测到另一个用户 提前致谢 另请参阅 J
  • 从 pandas 数据框中删除 NaN 值并重塑表[重复]

    这个问题在这里已经有答案了 给定一个包含列的数据框NaNs 如何转换数据框以删除所有NaN从列中 示例数据框 import pandas as pd import numpy as np dataframe from list of lis
  • 计算网络中的周期

    最好的方法是什么 或者是否有任何方法可以实现对网络中的 3 个和 4 个周期进行计数 3 个周期等于从一个模式网络计算的三个节点 三角形 的连接组 4 个周期等于由两个模式网络计算的四个节点 方块 的连接组 如果我有这样的网络 onemod
  • 是否可以上传文本文件以HTML/JS输入?

    我在 HTML 表单中有一些输入框 需要在表单加载时更新这些输入框 并且需要从文本文件上传这些值 这里也提出了类似的问题 将文本文件上传到 Html JS 中的输入 https stackoverflow com questions 983
  • 查询列表项并使用 SharePoint Web 服务与对象模型

    我的公司正在考虑编写一个自定义应用程序 该应用程序需要跨多个网站集执行许多列表项查询 它需要运行 WSS 3 0 如果它也能在 WSS 2 0 上运行 那就太好了 它不会是为 MOSS SPS 设计的 但如果它能在这些平台上运行的话 那就太
  • 何时使用 f:viewAction / preRenderView 与 PostConstruct?

    什么时候应该使用f viewAction or preRenderView初始化页面数据的事件与使用 PostConstruct注解 是否根据支持 bean 的范围类型使用其中一种或另一种的基本原理 例如如果支持 bean 是 Reques
  • 如何在Center中设置WebView内容?

    我正在 WebView 中加载一些 HTML 内容 但它总是出现在我的 WebView 的左上角 我也尝试使用样式表 在样式表中我添加了与中心相关的标签 但它没有位于中心 样式表中的其他标签工作正常 如何设置WebView中的内容垂直和水平
  • 如何使用 state go 方法在 Angular 状态路由器中的网址 url 中形成查询字符串

    我有一个产品列表页面 有产品列表 当单击特定产品时 调用该函数并在函数 state go 中 不在动态模式下工作 state go home product detail productID redminote4 brand x store
  • 如何查看我的 laravel 数据库?

    我已经设置了功能性的 laravel 项目 数据库连接有效 我已经通过终端添加了一些表 但现在我想看到它 就像您可以使用 phpmyadmin 看到所有内容一样 默认情况下如何找到数据库文件以及如何打开它 在终端中 cd 进入项目目录 va
  • 将嵌套 C++ 向量作为内置样式多维数组传递

    如果我有一个 C 向量 我知道我可以安全地将它作为数组传递 指向所包含类型的指针 void some function size t size int array impl here std vector
  • 即使出现异常也希望程序继续运行

    我搜索了几次 但我没有找到我真正想要的东西 我正在以出色的处理能力 尝试 捕捉 进行锻炼 在那里我发现了这个障碍 如果程序发现异常 它就会终止 我尝试调用一个函数catch部分 但它仍然终止 void exception handle Th
  • 我的sparkDF.persist(DISK_ONLY)数据存储在哪里?

    我想更多地了解spark中hadoop的持久化策略 当我使用 DISK ONLY 策略保存数据帧时 我的数据存储在哪里 路径 文件夹 我在哪里指定这个位置 对于简短的答案 我们可以看看文档 https spark apache org do
  • Spring Data Rest - 代理路径不包括链接路径

    我正在代理 Spring REST 后端 如下所示 后端 http backend 8080 代理本地主机 localhost 3000 api backend gt http backend 8080 如果我在本地浏览到代理端点 它将代理
  • 如何从 k8s 将 `sysctl` 标志传递给 docker?

    场景 我有一个容器镜像需要运行net core somaxconn gt 默认值 我正在使用 Kubernetes 在 GCE 中部署和运行 我的集群中的节点 虚拟机 配置正确net core somaxconn价值 现在的挑战是用 fla
  • 将 UTF8 字符串解码为拉丁文

    我正在尝试将 UTF8 字符串转换为拉丁字符 这是我如何尝试实现此目标的示例 string sUnicode Peneda Ger s string result Encoding Unicode GetString Encoding Co
  • 强制绑定到数据源的复选框在尚未查看时更新

    这是一个测试框架来展示我正在做的事情 创建一个新项目 添加选项卡式控件 在选项卡 1 上放置一个按钮 在选项卡 2 上放置一个复选框 粘贴此代码作为其代码 使用控件的默认名称 public partial class Form1 Form