Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果控件位于非';看不见_C#_Winforms - Fatal编程技术网

C# 如果控件位于非';看不见

C# 如果控件位于非';看不见,c#,winforms,C#,Winforms,我有一个在Windows桌面应用程序中使用WinForms的C#程序。它包括一个选项卡控件,6个选项卡中的每个选项卡都有文本框等等。其中一些控件显示应用程序在后台线程中获得的值 有时,会获得一些值,这些值将显示在当时不可见的选项卡上的控件上。当我测试它时,当我更改回该选项卡时,这些值不会显示 我的问题是:是否有什么东西阻止Windows.Forms更新更新时不可见的控件上的值?它们没有被禁用,不管它们之前是否被渲染过,都会发生这种情况,我不会想出它们不出现的任何其他原因。有谁能证实这一点,或者告

我有一个在Windows桌面应用程序中使用WinForms的C#程序。它包括一个选项卡控件,6个选项卡中的每个选项卡都有文本框等等。其中一些控件显示应用程序在后台线程中获得的值

有时,会获得一些值,这些值将显示在当时不可见的选项卡上的控件上。当我测试它时,当我更改回该选项卡时,这些值不会显示


我的问题是:是否有什么东西阻止Windows.Forms更新更新时不可见的控件上的值?它们没有被禁用,不管它们之前是否被渲染过,都会发生这种情况,我不会想出它们不出现的任何其他原因。有谁能证实这一点,或者告诉我必须去别处看看?或者给我另一个地方看看?

我会在这里给出一个答案,因为这句话:

其中一些控件显示应用程序在后台线程中获得的值

我将在这里讨论一个问题,假设您正试图使用获取文本框的背景线程来设置文本框的文本。如果是这种情况,则不能在UI线程以外的任何其他线程上修改任何与UI相关的内容

以下是您不想做的事情的示例:

private void button1_Click(object sender, EventArgs e)
{
    new Thread(() =>
    {
        textBox1.Text = "Don't do this";
    }).Start();
}
它可能具有未定义的行为,甚至使应用程序崩溃。你应该做的是:

private void button1_Click(object sender, EventArgs e)
{
    new Thread(() =>
    {
        Invoke(new Action(() =>
        {
            textBox1.Text = "Hello!";
        }));
    }).Start();
}
WinForms中的控件(本例中的主窗体)有一个名为
Invoke
的方法,该方法将在控件UI线程上运行委托

回答你的问题:

是否存在阻止Windows.Forms更新更新时不可见的控件上的值的情况

不可以。即使禁用了控件,也可以设置控件属性。它们是否被隐藏也无关紧要


如果出于任何原因,这无法解决您的问题,请在评论中告诉我,我将删除此答案。

选项卡页面中从未显示过的控件不会创建其句柄。这可能会影响控件的行为。如果设置控件的文本,则该文本将被缓存,并在控件创建其句柄时显示。例如,如果您设置组合框的SelectedItem(即执行操作),这取决于操作的方式,则可能根本不会执行依赖于此的操作和后续操作。我很抱歉没有包含此信息:例如,我使用
c.BeginInvoke((委托){((textbox)c).Text.value=value}更新文本框);,因为即使控件位于当前选项卡上,不这样做也会导致问题。@Jimi即使控件更新时隐藏的选项卡以前显示过,也会发生这种行为。我应该明确地说出来。@arcy您确实需要显示您的代码。什么是后台线程以及如何处理它们,如何获取需要更新的控件实例,为什么会有类似
((TextBox)c).Text.value=value
Text.value
?这是打字错误吗?)。如果运行任务或启动线程,请使用委托更新UI。此回调始终在UI线程中执行。如果线程上下文被正确捕获。顺便说一句,当您
BeginInvoke()
时,将父窗体用作封送拆收器,而不是控件(您也在强制转换)。