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)

c#label text获胜';单击按钮后不会更新用户控件

主要问题似乎是在显示的控件之外的控件上设置了标签。当您的点击事件(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;
}

这可能是最容易使用的代码,也不太容易出错,但请注意,如果以后需要注销事件,这可能会很棘手。