2012-09-07 35 views
2

使用Windows窗體,動態創建兩個鏈接標籤。當用戶點擊任何鏈接標籤時,會創建一個動態表單。在這種形式下,我創建了一個數據網格,一個文本框和一個動態放置的按鈕(以該動態形式)。現在我想訪問動態按鈕點擊事件中的動態數據網格。我怎樣才能做到這一點?在Windows Forms C#.NET中查找控件?

private void Users_Load(object sender, EventArgs e) 
{ 
    da = new SqlDataAdapter("Usp_Get_Employees", con); 
    ds = new DataSet(); 
    da.Fill(ds); 

    if (ds.Tables[0].Rows.Count > 0) 
    { 
     for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
     { 
      string somecode = i.ToString() + ds.Tables[0].Rows[i]["eid"].ToString(); 
      LinkLabel lbluser = new LinkLabel(); 
      lbluser.Name = ds.Tables[0].Rows[i]["eid"].ToString(); 
      lbluser.Text = ds.Tables[0].Rows[i]["ename"].ToString(); 
      lbluser.Location = new System.Drawing.Point(40, i * 40); 
      lbluser.Size = new System.Drawing.Size(50, 30); 
      Controls.Add(lbluser); 
      lbluser.Click += new EventHandler(lbluser_Click); 
     } 
    } 
} 


void lbluser_Click(object sender, EventArgs e) 
{ 
    LinkLabel lnkClis = (LinkLabel)sender; 
    Form frm = new Form(); 
    frm.Name = lnkClis.Name; 
    frm.Text = lnkClis.Text; 
    frm.Show(); 

    DataGrid dtgrd = new DataGrid(); 
    dtgrd.Location = new System.Drawing.Point(10, 1 * 40); 
    dtgrd.Name = lnkClis.Name; 
    names = lnkClis.Name; 

    TextBox tx = new TextBox(); 

    tx.Location = new System.Drawing.Point(10, 5 * 40); 
    tx.Size = new Size(80, 30); 
    tx.Multiline = true; 
    tx.LostFocus += new EventHandler(tx_LostFocus); 

    Button btn = new Button(); 
    btn.Location = new System.Drawing.Point(10, 7 * 40); 
    btn.Size = new System.Drawing.Size(50, 30); 
    btn.Name = lnkClis.Name; 
    btn.Click += new EventHandler(btn_Click); 

    frm.Controls.Add(dtgrd); 
    frm.Controls.Add(tx); 
    frm.Controls.Add(btn); 
} 

// Now I am trying to access the data grid in the btn_click event 

void btn_Click(object sender, EventArgs e) 
{ 
    Button btsave = (Button)sender; 
    string eid = btsave.Name; 

    object grd = btsave.Parent.Controls.Find("dtgrd", true).FirstOrDefault(); 

    ((DataGrid)grd).DataSource = ds.Tables[0]; 
} 

現在我得到一個對象的實例的錯誤對象定在:

((DataGrid)grd).DataSource = ds.Tables[0]; 

回答

2

你寫異常消息:

現在我得到一個對象的實例的錯誤對象定在

是沒有意義的,但它看起來像

對象引用未設置爲實例一個對象

如果是這種情況,我認爲錯誤產生於Find方法調用。根據documentation

通過它們的Name屬性搜索控件並構建所有匹配控件的數組。

在你的按鈕單擊處理程序,你認爲電網被稱爲dtgrd,但是當你創建一個網格你的名字是這樣的:

dtgrd.Name = lnkClis.Name; 

如果你改變這條線就足夠:

dtgrd.Name = "dtgrd"; 

話雖如此,你應該考慮使用匿名方法的按鈕點擊處理程序。這將消除首先調用Find方法的需要。

void lbluser_Click(object sender, EventArgs e) 
{ 
    //... 
    DataGrid dtgrd = new DataGrid(); 
    //... 
    Button btn = new Button(); 
    //... 
    btn.Click += (sender,args)=> dtgrd.DataSource = ds.Tables[0]; 
+0

非常感謝我收到了。感謝您給予回覆Rafal先生 –

1

試試下面的代碼

public Form1() 
    { 
     Form f1 = new Form(); 

     f1.Text = "New Form"; 

     TextBox t1 = new TextBox(); 
     t1.Top = 0; 
     t1.Name = "t1"; 
     t1.Visible = true; 
     f1.Controls.Add(t1); 

     Button b1 = new Button(); 
     b1.Top = 30; 
     b1.Name = "b1"; 
     b1.Text = "Click"; 
     b1.Click += b1_Click; 
     f1.Controls.Add(b1); 

     f1.Show(); 
    } 

    public void b1_Click(object sender, EventArgs e) 
    { 
     Button btn = (Button)sender; 
     object txt = btn.Parent.Controls.Find("t1", false).First(); 
     ((TextBox)txt).Text = "Hi, you have clicked me."; 
    } 
+0

嗨nithesh,在上述情況下工作正常,但是當我採取datagrid它顯示錯誤。我的代碼是:object grd = btsave.Parent.Controls.Find(「dtgrd」,false).FirstOrDefault(); ((DataGrid)grd).DataSource = ds。表[0]; –

+0

我添加了我的代碼,請檢查一次 –

1

我修改Nitesh的代碼位。只需使用Lambda捕捉到單擊處理文本框:

public Form1() 
{ 
    Form f1 = new Form(); 

    f1.Text = "New Form"; 

    TextBox t1 = new TextBox(); 
    t1.Top = 0; 
    t1.Name = "t1"; 
    t1.Visible = true; 
    f1.Controls.Add(t1); 

    Button b1 = new Button(); 
    b1.Top = 30; 
    b1.Name = "b1"; 
    b1.Text = "Click"; 
    b1.Click += (sender, args) => MessageBox.Show("The text is: " + t1.Text); 
    f1.Controls.Add(b1); 

    f1.Show(); 
} 
+0

我添加了我的代碼,請檢查一次 –

0

你所得到的錯誤是從語句(如grd對象null):

((DataGrid)grd).DataSource = ds.Tables[0]; 

既然你正試圖趕上動態控制的保持,這是很好的有一個適當的空檢查,類型檢查和錯誤處理。這樣的事情:

if(grd != null && grd is DataGrid) 
    ((DataGrid)grd).DataSource = ds.Tables[0]; 
+0

請將格式添加到您的代碼中,這會使其更具可讀性 – Vamsi