2013-11-21 51 views
0

我正在嘗試從窗體顯示的事件中更改控件的可見狀態。如何訪問windows窗體中顯示的事件控件?

我正在從數據庫表中讀取控件的名稱並使用this.Controls["controlname"].Visible來訪問它。但是一些控件無法從此事件中訪問。它顯示出例外。

如何從窗體顯示事件訪問控件?

+0

請問什麼例外... –

+0

@KingKing它顯示爲空例外 – user1690835

+3

[SSCCE](http://www.sscce.org/)會有幫助 –

回答

2

使用Controls.Find()到搜索它。正如scheien指出的那樣,控件可能位於不同的容器內,導致它不會被原始語法「發現」。這裏有一個簡單的例子:

private void Form1_Shown(object sender, EventArgs e) 
    { 
     string ctlNameFromDatabase = "textBox1"; 

     Control[] matches = this.Controls.Find(ctlNameFromDatabase, true); 
     if (matches.Length > 0) 
     { 
      // ... do something with "matches[0]" ... 

      // you may need to CAST to a specific type: 
      if (matches[0] is TextBox) 
      { 
       TextBox tb = matches[0] as TextBox; 
       tb.Text = "Hello!"; 
      } 
     } 
     else 
     { 
      MessageBox.Show("Name: " + ctlNameFromDatabase, "Control Not Found!"); 
     } 
    } 

編輯:

有關的MenuItems你必須標記該控件的名稱在數據庫中的「菜單項」,然後使用這個代碼,其中menuStrip1是找到它們的名稱:

 string menuName = "copyToolStripMenuItem"; 
     ToolStripItem[] matches = menuStrip1.Items.Find(menuName, true); 
     if (matches.Length > 0) 
     { 
      matches[0].Visible = true; 
     } 

相同的代碼也適用於ToolStrips。例如,將menuStrip1替換爲toolStrip1

+0

我正在使用子窗口和容器父窗口。以上代碼在子窗口中工作,但不在父容器窗口中。 – user1690835

+0

Controls.Find()無法在其他表單中找到控件。如果您需要在其中一個子窗體中查找控件,那麼首先需要對該子窗體的引用,然後對該子窗體調用Controls.Find()。 –

+0

我想在容器窗體中顯示或隱藏菜單欄和工具條項目。以上代碼不適用於這些項目。 – user1690835

相關問題