2015-12-07 95 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; 
} 

這可能是最容易使用的代碼,並且不易出錯,但請注意,如果您以後需要取消註冊事件,它可能會很棘手。