2015-12-07 96 views
-1

我有一个用户控件加载到Form1在WinForm应用程序时,当一个菜单选项被选中。用户控件具有用于触发打印机选择对话框的按钮,并允许用户为应用程序设置多台打印机。每个按钮配置应用程序中的设置属性以存储打印机。在每个按钮下都有一个标签,显示来自settings属性的打印机名称。按钮点击后c#标签文本将不更新usercontrol后

我正在使用事件来管理usercontrol中的按钮点击。一切正常的事件与设置属性中存储正确的打印机的事件。但是,我希望标签能够在打印机对话框中选择它后立即显示选定的打印机。它不会显示打印机的更改,直到我离开usercontrol并返回。然后它为每个按钮显示正确的打印机名称。

我能够写入标签文本就好了。我尝试刷新标签,使标签失效并更新。似乎没有任何工作。只有导航离开和返回将在标签中显示打印机名称。

这里是在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) 
+0

我是否正确理解您使用.NET数据绑定将打印机设置控件保存到应用程序设置?如果是这样,我想默认情况下,设置对象不会更新,直到控件被验证(即焦点离开控件时)。您可以从DataBindings下的属性表访问的高级对话框中将其从OnValidation更改为OnPropertyChanged。 – adv12

+0

我不知道你的问题的答案。我在属性表中看不到DataBindings。 –

+0

好吧,也许我误解了。 – adv12

回答

0

的主要问题似乎是,您将标签设置在除您正在展示的控件以外的其他控件上。 当点击事件(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财产得到它。发件人是在控制按钮,所以假设该按钮在控制直接坐,按钮的父母将是控制:

​​

如果按钮是不是在控制直接坐(例如,它可能坐在一个位于控件中的面板中),那么您可能需要更多链接,您可以在事件条目中放置断点并检查发件人。

3. 第三种方法可能是最好的,但它需要你改变你的设计。似乎你每次菜单被点击时都会反复创建控件。也许有一个很好的理由,但假设没有真正的理由,最好在开始时创建一次用户控件,然后切换原始控件。然后,您可以将您的控件放入类变量中并在事件中使用它。

4. 为了完整起见,您还可以为事件使用lambda/anonymous方法,并在注册事件时捕获控件。 如果你这样做,那么在您注册事件的方法,更换注册码是这样的:

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; 
} 

这可能是最容易使用的代码,并且不易出错,但请注意,如果您以后需要取消注册事件,它可能会很棘手。