2012-04-17 62 views
0

我使用Form2更新默認打印機並將字符串發送到Form3。我通常沒有問題從Form1操作並將數據傳遞給Form2或Form3。但無法使用Form2更新Form3!從Form2發送字符串到Form3

真正的名字是:Form1中= Form1中,窗體2 = formUserSettings,Form3 = formViewDwg

這裏是在Form1的代碼,調用窗體2(formUserSettings):

private void configureStartupSettingsToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     formUserSettings frmUsr = new formUserSettings(prnNameString, prnDriverString, prnPortString, 
      Settings.Default.DefaultPrinter.ToString(), Settings.Default.ViewStyle, Settings.Default.ReCenterEVafterDwgClose, 
      Settings.Default.SyncListDwgNum, listMain); 
     frmUsr.ValueUpdated += new ValueUpdatedEventHandler(frmUsr_ValueUpdated); //---added 3-22-12 
     //frmUsr.ValueUpdated2 += new ValueUpdatedEventHandler(newPrn_ValueUpdated); //---added 4-12-12 

     frmUsr.ShowDialog(); 
     frmUsr.Close(); 
    } 

這裏的內部窗體2的代碼( formUserSettings)試圖將打印機名稱發送到Form3(formViewDwg)。

if (Application.OpenForms.OfType<formViewDwg>().Count() > 0) 
      { 
       newEntry = comboPrinters.Items[index].ToString(); 
       formViewDwg frmVd = this.Owner as formViewDwg; 
       delPassData del = new delPassData(frmVD.passedNewVal); 
       del(newEntry); 
      } 
      else 
      { 
       frmVD = new formViewDwg(EViewMethods.currentPartPath, EViewMethods.currentPartNum, EViewMethods.currentDwgNum, 
        Settings.Default.DefaultPrinter, Settings.Default.DefaultPrinterDriver, Settings.Default.DefaultPrinterPort, 
        EViewMethods.defaultPrn[0], EViewMethods.defaultPrn[1], EViewMethods.defaultPrn[2], lBox, false, false); 

       newEntry = comboPrinters.Items[index].ToString(); 
       delPassData del = new delPassData(frmVD.passedNewVal); 
       del(newEntry); 
      } 

內部Form3(formViewDwg)爲:

public void passedNewVal(string newPrn) // using the delegate "delPassData" declared in formUserSettings 
    { 
     try 
     { 
      comboPrinter.Text = newPrn; 
     } 
     catch 
     { 

     } 
    } 

的錯誤是 「代表一個實例方法不能具有空 '這個'」。

+3

可能重複[?如何複製從Form1中到窗體2的文本框的值(http://stackoverflow.com/questions/3384961/how:打印機名稱將作爲構造「字符串prnName」傳遞從form1到form2的複製一個文本框值) – 2012-04-17 21:50:40

+0

我不明白如何有可能的formViewDwg將是formUserSettings的所有者。 – Steve 2012-04-17 21:59:37

+0

我想讓formUserSettings發送新的打印機名稱字符串到formViewDwg。你上面看到的代碼是圍繞第四次嘗試這樣做的。我也用過:string newEntry = comboPrinters.Text; ValueUpdatedEventArgs valueArgs = new ValueUpdatedEventArgs(newEntry); ValueUpdated(this,valueArgs); ValueUpdatedEventArgs valueArgs2 = new ValueUpdatedEventArgs(newEntry); ValueUpdated2(this,valueArgs2); – 2012-04-18 03:17:02

回答

0

嗯,我從來沒有發現如何將字符串從Form2發送到Form3,但我找到了一個很好的解決方案:當Form2關閉並從「frmUsr_ValueUpdated」發送它的字符串到Form1時,它檢查Form3是否打開。如果是,那麼Form3中的公共方法用於更新其comboBox.text,如下所示。 (Form1中= Form1中,窗體2 = formUserSettings,Form3 = formViewDwg {實例= frmVD})

private void frmUsr_ValueUpdated(object sender, ValueUpdatedEventArgs e) //---added 3-22-12 
    { 
     // Update the printer name on Form1 with the new value from formUserSettings 
     string prnStr = e.NewValue; 
     string[] parts = prnStr.Split('^'); //the printer name, driver and port were passed by e.NewValue, being separated by a "^" 

     //---added 5-7-12 
     EViewMethods.defaultPrn[0] = parts[0]; //printer name 
     EViewMethods.defaultPrn[1] = parts[1]; //printer driver 
     EViewMethods.defaultPrn[2] = parts[2]; //printer port 

     toolStripStatusLabel3.Text = parts[0]; 

     //---added 5-7-12 
     if (frmVD != null && !frmVD.IsDisposed) //want to send the new printer name now if formViewDwg is already open. If it is not open, then when it is called to open, the formViewDwg constructor will pass the new printer to it. 
     { 
      frmVD.ProcessPrinterName(parts[0]); //ProcessPrinterName is a public method inside formViewDwg. Can call here because formViewDwg is already open! 
     } 
    } 

內部formViewDwg(Form3)是公衆ProcessPrinterName方法:

public void ProcessPrinterName(string message) 
    { 
     comboPrinter.Text = message; 
    } 

如果Form3(formViewDwg)不打開,那麼無論何時通過其構造函數參數列表調用實例,更新後的打印機名稱都將傳遞給它。

public formViewDwg(string currentPath, string currentPartNum, string currentDwgNum, 
      string prnNameList, string prnDriverList, string prnPortList, 
      string prnName, string prnDriver, string prnPort, ListBox lstBox, bool usingEngCode, bool engCodeIsEnabled) //---added 3-12-12 
    { 
     InitializeComponent(); 
0

試試這個:

In Form1 

Form2 vForm2=new Form2(); 
vForm2.vForm1=this;  //initialize the vForm1 variable of Form2 to this form 
vForm2.Show(); 

和Form2的定義類型Form1的一個全球性的公共變量。

public Form1 vForm1; 

你現在可以玩弄Form1的任何屬性。

+0

謝謝,我會檢查看看這是否有效。我現在不能這樣做,因爲我不得不出門做生意。我會盡快檢查。 – 2012-04-18 20:02:32