0

新しいフォームからの新しい情報で SQL データバインド コンボボックスを更新しようとしています。追加/編集を行ってポップアップフォームに保存した後、コンボボックスを新しい情報で更新し、現在追加/編集されているアイテムを選択したいと考えています。現在、以下のコードはリストを更新しますが、参照変数のように親フォームの「myID」を変更しません。これを最も効率的に行うにはどうすればよいですか?同様のタイプのことを行うために、約20のフォームがあります。

フォーム1で

    int newid = 0;
    private void addToolStripMenuItem1_Click(object sender, EventArgs e)
    {
        CoalSeamsForm csf = new CoalSeamsForm(ref newid);
        csf.ShowDialog();
        coalSeamsTableAdapter.Fill(well_Information2DataSet.CoalSeams);
        coalSeamsBindingSource.Find("CoalSeamID", newid);
    }

フォーム 2 で

    int myID = 0;

    public CoalSeamsForm(ref int myId)
    {
        this.myID = myId;
        InitializeComponent();
    }

    private void CoalSeamsForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (!isOK)
        {
            if (DialogResult.Yes == MessageBox.Show("Would you like to save the changes?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question))
            {
                Save();
                DataRowView drv = (DataRowView)coalSeamsBindingSource.Current;
                myID = (int)drv["CoalSeamID"];
            }
        }
    }
}
4

2 に答える 2

1

ここに問題があります。このコードがコンパイルされるかどうかさえわかりません。(同じ名前の 2 つの変数?)

int myID = 0; 
public CoalSeamsForm(ref int myID) 
{ 
    this.myID = 0; 
    InitializeComponent(); 
} 

ただし、問題は、フォーム コンストラクター内で myID を ref で渡し、コードが終了することです。Form_Closing で var myID を更新すると、コンストラクター内で渡された var を参照しなくなります。問題を解決するには、次のようなグローバル プロパティを宣言します。

public property MyID {get; set;}

次にコンストラクタで

public CoalSeamsForm() 
{ 
    this.MyID = 0; 
    InitializeComponent(); 
} 

ユーザーが CONFIRM ボタンをクリックしたときにプロパティを更新します (form_closing イベントではありません)。

   private void ConfirmButton_Click(object sender, EventArgs e)   
   {   
       ...
       this.MyID = (int)drv["CoalSeamID"];   
       this.DialogResult = DialogResult.OK;
   }   

最後に、呼び出し時にプロパティ値を使用します

    using(CoalSeamsForm csf = new CoalSeamsForm())
    {
        if(DialogResult.OK == csf.ShowDialog())
        {
            coalSeamsTableAdapter.Fill(well_Information2DataSet.CoalSeams);    
            coalSeamsBindingSource.Find("CoalSeamID", this.MyID);  
        }
    }  
于 2012-04-19T20:30:55.193 に答える
0

参照パラメーターは、呼び出し元のメソッド/コンストラクター内でのみ機能します。それらが個々のメソッドの外にあると、2 番目のオブジェクト内のコピーになります。実装するために、Steve などの提案から、パブリック プロパティを使用し、最初のフォームからアクセスしました。また、投稿されたコードでデータバインドされたコンボボックスを使用しました。これは、BindingSource.Position プロパティを設定するのではなく、より典型的なアプリケーションです。

フォーム1で

private void addEditCoalSeams(bool isAdd)
    {
        int? myId=null;
        if (!isAdd)
        {
            myId = (int?)coalSeamsComboBox.SelectedValue;
        }

        using (CoalSeamsForm csf = new CoalSeamsForm(myId, isAdd))
        {
            if (DialogResult.OK == csf.ShowDialog())
            {
                coalSeamsTableAdapter.Fill(well_Information2DataSet.CoalSeams);
                coalSeamsComboBox.SelectedValue = csf.coalID;
            }
        }
    }

コールシームスフォームで

    public int? coalID {get; set;}
    bool isAdd = false;

    public CoalSeamsForm(int? coalId, bool isAdd)
    {
        this.coalID = coalId;
        this.isAdd = isAdd;
        InitializeComponent();
    }

    private void okButton_Click(object sender, EventArgs e)
    {
        Save();
        DataRowView drv = (DataRowView)coalSeamsBindingSource.Current;
        this.coalID = (int)drv["CoalSeamID"];
        this.DialogResult = DialogResult.OK;
    }
于 2012-04-24T18:01:59.993 に答える