在 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();
我有以下问题:
我有一个表格,我可以从中调用第二个表格。首先,我检查 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();