c#label text获胜';单击按钮后不会更新用户控件
本文关键字:更新 控件 用户 按钮 单击 获胜 text c#label | 更新日期: 2023-09-27 18:25:58
我有一个用户控件,当选择菜单选项时,它会加载到winform应用程序中Form1上的面板中。用户控件具有用于启动打印机选择对话框的按钮,并允许用户为应用程序设置多台打印机。每个按钮配置应用程序中的设置属性以存储打印机。每个按钮下都有一个标签,用于显示设置属性中的打印机名称。
我正在使用事件来管理用户控件中的按钮单击。在settings属性中存储正确打印机的事件,一切都很好。但是,我希望标签在打印机对话框中选择后立即显示所选打印机。在我离开用户控制并返回之前,它不会显示打印机的更改。然后显示每个按钮的正确打印机名称。
我可以很好地写标签文本。我尝试过刷新标签,使标签无效并更新标签。似乎什么都不管用。只有来回导航才能在标签中显示打印机名称。
这是我在Form1:上的一个按钮点击处理程序
private void btnTwoByHalf_Click(object sender, EventArgs e)
{
ucPrinterSetup prn = new ucPrinterSetup();
twoByHalf.PropName = "TwoByHalfPrn";
twoByHalf.SetPrinter(twoByHalf.PropName);
prn.lblTwoByHalf.Text = twoByHalf.Printer;
}
这是我的菜单选项点击处理程序:
private void configurePrintersToolStripMenuItem_Click(object sender, EventArgs e)
{
ClearFrames();
ucPrinterSetup printerSetup = new ucPrinterSetup();
pnlMenu.Controls.Add(printerSetup);
printerSetup.btnTwoByHalfClick += new EventHandler(btnTwoByHalf_Click);
printerSetup.btnFourByOneClick += new EventHandler(btnFourByOne_Click);
printerSetup.btnFourByTwoFiveClick += new EventHandler(btnFourByTwoFive_Click);
printerSetup.btnMiscClick += new EventHandler(btnMisc_Click);
printerSetup.btnDefaultClick += new EventHandler(btnDefault_Click);
printerSetup.btnSecondaryClick += new EventHandler(btnSecondary_Click);
ucConfigurePrinters configurePrinters = new ucConfigurePrinters();
pnlFrame.Controls.Add(configurePrinters);
}
这是我的按钮点击处理程序从ucPrinterSetup.cs:
private void btnTwoByHalf_Click(object sender, EventArgs e)
{
if (btnTwoByHalfClick != null)
btnTwoByHalfClick(sender, e);
}
其他一切都很好。在我选择新打印机后,它不会更新label.text,直到我离开ucPrinterSetup并返回。
更新1:我的打印机通过以下方式存储在应用程序设置中:
twoByHalf.PropName = "TwoByHalfPrn";
twoByHalf.SetPrinter(twoByHalf.PropName);
twoByHalf.PropName是我在应用程序的设置属性中预先输入的名称。
然后我用将标签文本设置为打印机的名称
prn.lblTwoByHalf.Text = twoByHalf.Printer;
在应用程序设置中,我将打印机名称预设为:
TwoByHalfPrn - string - User - (no value)
主要问题似乎是在显示的控件之外的控件上设置了标签。当您的点击事件(btnTwoByHalf_Click
)被调用时,您应该使用当前显示的用户控件,但您使用ucPrinterSetup prn = new ucPrinterSetup();
创建了一个新控件
这不是显示的同一个控件,而是一个全新的控件,因此当您在prn
中更改标签时,您更改了不可见控件中的标签,原始控件将保持不变。
我可以看到4种获得原始控制的方法:
1。你可以从菜单上买到。如果你的菜单中只有一个这种控制类型的实例,你可以使用类似的东西(在我的代码中没有错误处理):
ucPrinterSetup prn = pnlMenu.Controls.OfType<ucPrinterSetup>().First();
twoByHalf.PropName = "TwoByHalfPrn";
twoByHalf.SetPrinter(twoByHalf.PropName);
prn.lblTwoByHalf.Text = twoByHalf.Printer;
或者,如果你有不止一个,你可以为你的控件分配不同的名称,并使用类似pnlMenu.Controls.Find("YourControlNameGoesHere", false).First();
的东西
2。您可以从活动中的sender
属性获取它。发送者是控件中的按钮,因此假设按钮直接位于控件中,则按钮的父级将是控件:
ucPrinterSetup prn = (ucPrinterSetup)((Control)sender).Parent);
如果按钮不直接位于控件中(例如,它可能位于控件中的面板中),那么您可能需要进一步向上移动,您可以在事件条目中放置断点并检查发件人。
3。第三种方法可能是最好的,但它需要你改变你的设计。似乎每次单击菜单时都会一次又一次地创建控件。也许这是有充分理由的,但假设没有真正的理由,最好在启动时创建一次用户控件,然后切换原始控件。然后,您可以将控件放在类变量中,并从事件中使用它。
4。为了完整起见,您还可以为事件使用lambda/匿名方法,并在注册事件时捕获控件。如果你这样做,那么在你注册事件的方法中,将注册代码替换为这样的代码:
printerSetup.btnTwoByHalfClick += (sender, e) => btnTwoByHalf_Click(printerSetup );
然后更改您的事件方法签名和代码如下:
private void btnTwoByHalf_Click(ucPrinterSetup prn)
{
twoByHalf.PropName = "TwoByHalfPrn";
twoByHalf.SetPrinter(twoByHalf.PropName);
prn.lblTwoByHalf.Text = twoByHalf.Printer;
}
这可能是最容易使用的代码,也不太容易出错,但请注意,如果以后需要注销事件,这可能会很棘手。