2016-07-07 17 views
0

私はウィンドウアプリケーションPOSを開発中です。要件:ボタン'seach item'をクリックして_mainform(form 1)を開いたときには_Searchform(form2)が開き、検索フォームにはlistviewという結果が表示され、フォーム3の選択項目ボタンには_searchform(form2)が表示されます。 listviewから選択した商品は、_mainform(form1) listviewに追加しています。C# - イベントハンドラ - あるフォームから別のフォームへの値の受け渡し

私はこの機能をデリゲートとイベントで実装しようとしています。 form3(検索結果フォーム)では、私はdelegateとeventを宣言し、form1(メインフォーム)でもそれを購読しています。しかし、私がform 1にアプリケーションイベントを実行すると、ドットが消えてしまいます。このコードは以下

_mainform(form1): 

     namespace KasseDelegate 
{ 

    public delegate void ListViewUpdatedEventHandler(object sender, ListViewUpdatedEventArgs e); 
    public partial class Form1 : Form 
    { 
     private Form3 frm3; 

     public Form1() 
     { 
      InitializeComponent(); 
      frm3 = new Form3(); 
      frm3.ListViewUpdated += new ListViewUpdatedEventHandler(Frm3_ListViewUpdated1); 

     } 

     private void Frm3_ListViewUpdated1(object sender, ListViewUpdatedEventArgs e) 
     { 
      MessageBox.Show("hi"); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Form2 frm2 = new Form2(); 
      frm2.Show(); 

     } 

    } 
} 



_searchform(form2) : 




    public partial class Form2 : Form 
     { 

      public Form2() 
      { 
       InitializeComponent(); 
      } 

      private void button1_Click(object sender, EventArgs e) 
      { 
       using (SQLiteConnection con = new SQLiteConnection(Properties.Settings.Default.ConnectionString)) 
       { 
        con.Open(); 
        SQLiteCommand cmd = new SQLiteCommand("select * from varer where [email protected]", con); 
        cmd.Parameters.AddWithValue("@Varenummer", "101"); 

        SQLiteDataReader dr = cmd.ExecuteReader(); 
        Form3 frm3 = new Form3(dr);        
        frm3.Show(); 
       } 
      } 
     } 

形態3:

namespace KasseDelegate 
{ 

    public partial class Form3 : Form 
    { 
     public event ListViewUpdatedEventHandler ListViewUpdated; 
     SQLiteDataReader dr1; 
     public Form3() 
     { 
      InitializeComponent(); 

     } 
     public Form3(SQLiteDataReader dr) 
     { 
      InitializeComponent(); 
      dr1 = dr; 
     } 

     private void Form3_Load(object sender, System.EventArgs e) 
     { 
      if (dr1 != null) 
      { 

       while (dr1.Read() == true) 
       { 
        ListViewItem LVI = new ListViewItem(); 
        LVI.SubItems.Add(dr1[0].ToString()); 
        LVI.SubItems.Add(dr1[1].ToString()); 
        LVI.SubItems.Add(dr1[2].ToString()); 
        LVI.SubItems.Add(dr1[3].ToString()); 
        LVI.SubItems.Add(dr1[4].ToString()); 
        listView1.Items.Add(LVI); 

       } 
      } 



     } 

     private void button2_Click(object sender, System.EventArgs e) 
     { 



      string sVareNummer = listView1.SelectedItems[0].SubItems[1].Text; 
      string sBeskrivelse = listView1.SelectedItems[0].SubItems[2].Text; 
      string pris = listView1.SelectedItems[0].SubItems[4].Text; 
      string enpris = listView1.SelectedItems[0].SubItems[5].Text; 
      if (ListViewUpdated != null) 
      { 
       ListViewUpdated(this, new ListViewUpdatedEventArgs() { VareNummer1 = sVareNummer, Beskrivelse1 = sBeskrivelse, Pris1 = pris, Enpris1 = enpris }); 
      } 


     } 
    } 
    public class ListViewUpdatedEventArgs : System.EventArgs 
    { 
     private string VareNummer; 
     private string Beskrivelse; 
     private string pris; 
     private string enpris; 
     public string VareNummer1 
     { 
      get 
      { 
       return VareNummer; 
      } 
      set 
      { 
       VareNummer = value; 
      } 
     } 
     public string Beskrivelse1 
     { 
      get 
      { 
       return Beskrivelse; 
      } 
      set 
      { 
       Beskrivelse = value; 
      } 
     } 
     public string Pris1 
     { 
      get 
      { 
       return pris; 
      } 
      set 
      { 
       pris = value; 
      } 

     } 

     public string Enpris1 
     { 
      get 
      { 
       return enpris; 
      } 
      set 
      { 
       enpris = value; 
      } 

     } 
    } 
} 

私はForm1にたForm3(displayitem)からリストビュー選択された項目の値を取得する方法(MainFormを)。

+1

YOUR Shiftキーが貼り付けられています。おっとっと。あまりにも私のもの。 –

+0

"frmVelgVarer"と "Varesøk"を理解するのは難しいです。どちらがform2で、どちらがform3ですか? –

+0

には3つの形式があります。 form1には、アイテムを検索するボタンがあります。ユーザーがそのボタンをクリックするとform2が開き、ユーザーは名前、IDで項目を検索できます。ユーザーが名前またはIDを入力して検索ボタンをクリックすると、form3がlistviewに結果として表示されます。だから私は、ユーザーがそのリストビュー(form3)からアイテムを選択し、選択をクリックしたいときはフォーム3から1つのリストビュー – Seeker

答えて

0

あなたは、このようなあなたのForm3と外部からのアクセスにそれをイベントに設定できます、この文句を言わない仕事

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     // This one is an instance of Form3 
     Form3 newForm = new Form3(); 
     newForm.SomethingHappens += RaiseHere; 
    } 

    public void RaiseHere(object sender, EventArgs e) 
    { 
     // Do something... 
    } 
} 

public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     // This one is NOT the same as on Form1. Its a NEW form. 
     Form3 newForm = new Form3(); 
     newForm.Show(); 
    } 
} 

public partial class Form3 : Form 
{ 
    public event EventHandler SomethingHappens; 

    public Form3() 
    { 
     //... 
    } 
} 

:下記のご意見をよる

public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     Form3 new3 = new Form3(); 
     // Access the event of form3 from outsite 
     new3.DisplayedItemChanged += ItemChanged; 
    } 

    public void ItemChanged(object sender, EventArgs e) 
    { 
     // This will be triggered. 
    } 
} 

public class Form3 : Form 
{ 
    // Create an event 
    public event EventHandler DisplayedItemChanged; 

    public void button1_Click(object sender, EventArgs e) 
    { 
     if (this.DisplayedItemChanged != null) 
     { 
      // Raise the event and pass any object 
      this.DisplayedItemChanged(yourObjectToPass, e); 
     } 
    } 
} 

を決してない。あなたが同じインスタンスを使用する必要があります。

Form3 newForm = new Form3(); 
newForm.SomethingHappens += RaiseHere; 
newForm.Show(); 

あなたのために、このありえないが明確な場合は、私は申し訳ありません、助けカント:

enter image description here

+0

返信ありがとう! 3つの形式があります。 form1には、アイテムを検索するボタンがあります。ユーザーがそのボタンをクリックするとform2が開き、ユーザーは名前、IDで項目を検索できます。ユーザーが名前またはIDを入力して検索ボタンをクリックすると、form3がlistviewに結果として表示されます。だから私は、ユーザーがそのリストビュー(form3)からアイテムを選択し、selectをクリックすると、それがフォーム3からその選択されたアイテムを追加して1つのリストビューを形成したいときにします。 – Seeker

+0

この例では、必要なものすべてを提供しています。 form2とform3のイベントを設定するだけです。 form2をform3のイベントに、form1をform2のイベントにフックします。 – C4u

+0

しかし、私はフォーム3のイベントをフォーム1にアクセスすることができます。私がこれをしようとすると、私のイベントはnullのままで、エラーが出ます。 – Seeker

2

正しく理解したら、Form1 - Form2を起動し、Form3を起動します。 Form3の項目を選択するときは、Form1に更新する必要があります。

デリゲートをForm1に宣言してください。 [Form2コンストラクタは、デフォルトパラメータとしてこれを受け入れる必要があります。 - Form2は、我々がデリゲートに強い依存関係を持っていない必要があるいくつかの他の場所からトリガされた場合ように] Form2に、このデリゲートを渡し

Form2でこのデリゲート型のプライベート変数を維持Form3を起動すると、同じデリゲートをForm3コンストラクタに渡します。 Form3

あなたはFrom1上のメソッドへの参照を保持している今、デリゲートを持っているので、項目が選択されるたびに、あなたはForm1上のメソッドを起動しますどのForm3に、このデリゲートを割り当てることができます。

ここでは動作例を示します。

public delegate void MyDelegate(string selectedItem); 
public class Form1 
{ 
    private MyDelegate delegate1; 

    public Form1() 
    { 
     delegate1 = new MyDelegate(ShowSelectedItem); 
     var form2 = new Form2(delegate1); 
    } 

    public void LaunchForm2() 
    { 

    } 

    private void ShowSelectedItem(string result) 
    { 

    } 
} 

public class Form2 
{ 
    private MyDelegate form2Delegate; 

    public Form2(MyDelegate del = null) 
    { 
     form2Delegate = del; 
     var form3 = new Form3(form2Delegate); 
    } 

    public void LaunchForm3() 
    { 

    } 


} 

public class Form3 
{ 
    private MyDelegate form3Delegate; 

    public Form3(MyDelegate del = null) 
    { 
     form3Delegate = del; 
     SelectedItemTriggered("tes"); 
    } 

    public void SelectedItemTriggered(string selectedItem) 
    { 
     form3Delegate(selectedItem); 
     //This will trigger method ShowSelectedItem of Form1 

    } 


} 
+0

こんにちはVishalを選択項目を追加します。手伝ってくれてありがとう 。私はデリゲートとウィンドウアプリケーションにはとても新しいです。私は以下のシナリオを説明している:\t 返信ありがとう! 3つの形式があります。 form1には、アイテムを検索するボタンがあります。ユーザーがそのボタンをクリックするとform2が開き、ユーザーは名前、IDで項目を検索できます。ユーザーが名前またはIDを入力して検索ボタンをクリックすると、form3がlistviewに結果として表示されます。だから私は、ユーザーがそのリストビュー(form3)からアイテムを選択し、選択をクリックしたい場合は、選択したアイテムをフォーム3から1つのリストビューに追加したい。 – Seeker

+0

こんにちはシーカー、私は小さなexample.please参照してください。 –

+0

こんにちはVishal!あなたは今plzコードを見ていることができます。私はフォーム2を購読すると購読するが、購読するには1からそれを購読する。事前に感謝 – Seeker

関連する問題