簡體   English   中英

將字符串從Form2發送到Form3

[英]Send string to Form3 from Form2

我正在使用Form2更新默認打印機,並將字符串發送到Form3。 我通常沒有問題,可以從Form1操作並將數據傳遞到Form2或Form3。 但是在使用Form2更新Form3時遇到了麻煩!

真實名稱為:Form1 = Form1,Form2 = formUserSettings,Form3 = formViewDwg

這是Form1中的代碼,調用Form2(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();
    }

這是Form2(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
        {

        }
    }

錯誤是“委托給實例方法不能具有空的'this'”。

嘗試這個:

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的任何屬性了。

好吧,我從來沒有發現如何將字符串從Form2發送到Form3,但是我找到了一個很好的解決方案:當Form2關閉並從“ frmUsr_ValueUpdated”將其字符串發送到Form1時,它將檢查Form3是否已打開。 如果是,則Form3中的公共方法用於更新其comboBox.text,如下所示。 (Form1 = Form1,Form2 = formUserSettings,Form3 = formViewDwg {instance = 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),則每當通過其構造函數參數列表調用實例時,更新的打印機名稱都將傳遞給它。 打印機名稱將在構造函數中作為“ string prnName”傳遞:

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM