从Form2发送字符串到Form3

问题描述:

我使用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://*.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

嗯,我从来没有发现如何将字符串从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(); 

试试这个:

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