0

Form2 を使用してデフォルトのプリンターを更新し、文字列を Form3 に送信しています。通常、Form1 から操作して Form2 または Form3 にデータを渡すことに問題はありません。しかし、Form2 を使用して Form3 を更新するのに問題があります。

実際の名前は、Form1 = Form1、Form2 = formUserSettings、Form3 = formViewDwg です。

Form2 (formUserSettings) を呼び出す Form1 のコードは次のとおりです。

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

Form3 (formViewDwg) にプリンター名を送信しようとする Form2 (formUserSettings) 内のコードを次に示します。

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
        {

        }
    }

エラーは、「インスタンス メソッドへのデリゲートは null 'this' を持つことはできません」です。

4

2 に答える 2

0

Form2 から Form3 に文字列を送信する方法がわかりませんでしたが、良い解決策を見つけました。Form2 を閉じて、その文字列を "frmUsr_ValueUpdated" から Form1 に送信すると、Form3 が開いているかどうかがチェックされます。その場合、Form3 内のパブリック メソッドを使用して、次のようにそのomboBox.text を更新します。(Form1 = Form1、Form2 = 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) が開いていない場合、コンストラクターのパラメーター リストを介してインスタンスが呼び出されるたびに、更新されたプリンター名が渡されます。プリンター名は、コンストラクターで「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();
于 2012-05-07T21:27:28.500 に答える
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 の任意のプロパティをいじることができるようになりました。

于 2012-04-18T13:02:24.783 に答える