在 C# .Net Windows 表单中更改标签颜色

Changing Label Color in C# .Net Windows Form

我有以下问题:

我有一个表格,我可以从中调用第二个表格。首先,我检查 Data 是否不为空,如果是,我打印一个 MessageBox 并且不显示表单。

        private void Form1_Click(object sender, EventArgs e)
        {
            //Create an Instance every Time clicked on the Button
            var Form_2 = new Form_2();

            if (Form2.get_data() == true)
            {
                Form_2.Show();
            }
            else
            {
                MessageBox.Show("No Data!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

如果用户按下将显示在第二个窗体上的 MessageBox 的 yes 按钮,我在 Button 下方也有一个应该更改的标签。

在第二个表单上,我可以使用 Yes/No 选项通过 MessageBox 打印表单上可视化的一些数据。所以我创建了一个私有静态 bool 变量,我在其中保存状态,所以如果用户按下 MessageBox 上的是按钮,我将其更改为 true。

private static bool printstatus;

private void btn_print_Click(object sender, EventArgs e)
        {

            DialogResult result_diag = MessageBox.Show("Do you want to print?", "Print Label", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            switch (result_diag)
            {
                case DialogResult.Yes:
                    var print_diag = new PrintDialog();
                    print_diag.ShowDialog();
                    set_printing_status();

                    break;

                case DialogResult.No:
                    //Do Nothing (only close MessageBox)
                    break;
            }
        }

        public void set_printing_status()
        {
            printstatus = true;
        }

        public bool get_printing_status()
        {
            return printstatus;
        }

然后在关闭表单时我创建了一个 Form_1 的实例,因此将调用将更改标签的更新状态函数。在这个函数中,我从 Form_2 调用 get_printing_status 方法并将结果保存到布尔值中:

public void set_printing_status()
        {

            bool print_status = false;
            print_status = Form_2.get_printing_status();

            if (print_status == true)
            {
                label_status_normal.Text = "Status: printed";
                label_status_normal.BackColor = Color.LimeGreen;
                label_status_normal.Invalidate();
                label_status_normal.Update();
            }
            else if (print_status == false)
            {
                label_status_normal.Text = "Status: not printed";
                label_status_normal.BackColor = Color.Red;
                label_status_normal.Invalidate();
                label_status_normal.Update();
            }
}

但它不会更改任何内容,它会到达 Methode 以更新 Form 中的状态,但不会更改 Text 或 BackColor。我做错了什么?

您应该避免在另一个控件中创建新的表单实例,这可能会导致泄漏或数据丢失。尝试使用相同的实例,这可能会达到您想要的效果。

其他解决方案是使用 UserControls,它们作为表单是有效的,避免新的 windows 弹出并且 class 之间的通信更容易。

如果您真的想使用一种形式,只需创建一个实例或像我提到的class,然后您就可以维护数据或随意使用。您可以创建方法来访问、编辑和清除表单内的所有数据。像对待其他任何东西一样对待它 class 就可以了。

虽然建议的两种形式设计看起来有点可疑,但要做什么,请查看 Invoke 方法 - 据我所知 - 它可以接受方法名称(如 foo - 没有 ()),它将在目标表单的“环境”中执行(请注意,此说明已大大简化)。

您可以在调用 Show() 时将 Form2 的“所有者”设置为您现有的 Form1。

变化:

Form_2.Show();

收件人:

Form_2.Show(this); // note the "this" in parenthesis!

现在在 Form2 中,您可以将 .Owner 属性 转换为 Form1 并调用所需的方法:

// ... in Form2 ...
// ... other code ...
Form1 f1 = (Form1)this.Owner;
f1.set_printing_status();