2017-10-01 7 views
0

フォームの名前とイベントの名前をデータベースに保存しています。フォームのメニュー項目とサブメニューをデータベースから取得しました。子供のクリック時にデータベースからイベント名を取り出し、変数に格納しました。その変数にあるそのイベントを呼び出します。この子供のクリックでデータベースからイベントを呼び出す

チェック:

// on form load 
private void MainForm_Load(object sender, EventArgs e) 
{ 
     MnuStrip = new MenuStrip(); 
     base.Controls.Add(this.MnuStrip); 
     MnuStrip.BackColor = Color.FromArgb(4, 71, 3); 
     MnuStrip.ForeColor = Color.Orange; 
     MnuStrip.Font = new Font("Arial", 12); 

     string selectCommandText = "select Main_menu,Manu_Par_value,Status from MenuParent where Status='Y'"; 
     SqlDataAdapter adapter = new SqlDataAdapter(selectCommandText, con); 
     DataTable dataTable = new DataTable(); 

     con.Open(); 

     adapter.Fill(dataTable); 

     foreach (DataRow row in dataTable.Rows) 
     { 
      this.MnuStripItem = new ToolStripMenuItem(row["Main_menu"].ToString()); 
      this.SubMenu(this.MnuStripItem, row["Manu_Par_value"].ToString()); 
      MnuStrip.Items.Add(this.MnuStripItem); 
     } 

     base.MainMenuStrip = MnuStrip; 
     con.Close(); 
} 

//submenu loads 
public void SubMenu(ToolStripMenuItem mnu, string submenu) 
{ 
     //SqlDataAdapter adapter = new SqlDataAdapter("SELECT FRM_NAME FROM vw_pagerole WHERE MENUPARVAL='" + submenu + "' and status = 1 and UID = '" + Username + "' ", con); 
     SqlDataAdapter adapter = new SqlDataAdapter("select mp.Main_menu, msm.Form_code, msm.form_Name, r.u_name from MenuParent mp ,MenuSubmenue msm, Rights r where mp.Manu_Par_value = msm.Manu_Par_value and mp.Manu_Par_value = r.Manu_Par_value and msm.menue_submenue_code = r.menue_submenue_code and r.Rights_invisible = 1 and mp.Main_menu='" + mnu + "' and r.u_name = '" + Username + "' ", con); 
     DataTable dataTable = new DataTable(); 
     adapter.Fill(dataTable); 

     foreach (DataRow row in dataTable.Rows) 
     { 
      ToolStripMenuItem item = new ToolStripMenuItem(row["form_Name"].ToString(), null, new EventHandler(ChildClick)); 
      mnu.DropDownItems.Add(item); 
     } 
} 

//on child click 
string eventclick; //event name stored in this string 
private void ChildClick(object sender, EventArgs e) 
{ 
     string query = ("select Form_code from MenuSubmenue where form_Name='" + sender.ToString() + "'"); 
     SqlCommand cmdd = new SqlCommand(query, con); con.Open(); 

     var dbr = cmdd.ExecuteReader(); 

     while (dbr.Read()) 
     { 
      eventclick = (string)dbr["Form_code"]; 
      label1.Text = eventclick; 
     } 
     con.Close();  
} 

は、私はあなたが名前でメソッドを呼び出すためにreflectionを使用することができ、文字列型変数名eventclickに

答えて

0

でこのイベントを呼び出したいです。 質問では、呼び出すメソッドが定義されているクラスも、このメソッドのシグネチャ(引数)も指定されていません。だから私は、メソッドが現在のフォームのインスタンスメソッドとして定義されており、イベントハンドラのために普通である署名(object sender, EventArgs e)を持っていると仮定します。

//Get instance method of this Form by method's name 
var method = this.GetType().GetMethod(
    eventclick, 
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); 

// Prepare arguments for method to be called. 
// Here I assume that method is standard event 
// handler and has two arguments of type object 
// and EventArgs 
EventArgs eventArgs = null;//create new EventArgs() if required by called method 
var arguments = new object[] { this, eventArgs }; 

//Invoke method with prepared arguments 
method.Invoke(this, arguments); 
+0

親愛なる私は、データベースに格納されaddprofiletoolstripmenuitem_clickと私は今、私はこのイベントを呼びたい、変数にフェッチ、このようなイベントがあります:コードの後に​​は、その後eventclick変数で定義された名前のメソッドを実行します。変数にイベントを列挙したいプライベートボイドaddProfileToolStripMenuItem_Click(オブジェクト送信者、のEventArgs電子) {profileform PF =新しいprofileform {profileTypeが= 1、 MdiParent =この }。 pf.Show(); } –

+0

@MUHAMMADSOHAIL:私のソリューションはうまくいくはずです。ただし、メソッド名では大文字と小文字が区別されるため、データベースには 'addprofiletoolstripmenuitem_click'ではなく 'addProfileToolStripMenuItem_Click'が含まれている必要があります。 –

+0

はいそれはいくつかのmenuesのthanks.butで動作します。mscorlib.dllで 'System.Reflection.TargetInvocationException'タイプの最初のチャンス例外が発生しました。 追加情報:例外が呼び出しのターゲットによってスローされました。 –

関連する問題