2013-07-19 77 views
0

我有幾個動態創建的文本框,如果我想在面板中找到文本框什麼是最好的方式來找到它?WPF C#從面板內部面板查找控件

我在網上搜索和一些通過FindName說我們可能能夠找到我們的控制,但爲此我需要給我的每個文本框的名稱和WPF中,名稱必須帶有字母不是int即使我把int .ToString它會搞砸了。但是如果我把信件放在信件上,我很難通過信件找到它們,因爲我可以從00開始,一路都是+1,但我不能那樣做。

我有一個動態創建WrapPanel內動態創建文本框和我添加創建WrapPanel動態創建的StackPanel裏面,然後我說stackkpanel添加到我的XAML側

已經創建了一個WrapPanel如果你問我的動態爲什麼我需要這麼多的面板,因爲這是唯一的方法,我可以讓我看起來更好,因爲我從db中獲取信息並顯示它的方式。

這裏是我的代碼看起來像(我把它剪短,因爲它太長):

 private void PopulateQuestion(int activityID, int taskID) 
    { 
     IList<Model.questionhint> lstQuestionHints = qh.GetRecords(taskID, activityID); 

     StackPanel sp = new StackPanel(); 

     foreach (Model.questionhint qhm in lstQuestionHints) 

     { 
      WrapPanel wp = new WrapPanel(); 

      //some code .... 

      if (qhm.Option1.Trim().Length > 0 && 
       qhm.Option2.Trim().Length > 0) 
      { 
       wp.Children.Add(space); 
       wp.Children.Add(tbox); // 

      } 
       sp.Children.Add(wp);// Adding wrap panel to stackpanel 
      } // end of for each loop. 

      WrapPanelTest.Children.Add(sp); // Adding stackpanel to WrapPanel (in xaml) 

     } 

WrapPanelTest是我在XAML端創建面板。所以,現在如果我有一個按鈕,我應該如何找到這些面板的文本框控件?

我想:

 private void button1_Click(object sender, RoutedEventArgs e) // Check Button 
    { 
      int c = 0; 

     foreach (TextBox txtbox in WrapPanelTest.Children) 
     { 
      c++; 
     } 

     MessageBox.Show(c); 

}

但它顯示了這個錯誤(這點在foreach循環文本框txtbox):

enter image description here

+0

抱歉,但該死的傢伙那是地獄混亂。我不明白在WrapPanel中的'StackPanel'中需要一個動態的'WrapPanel'。那麼用'DataTemplate'和'Binding'的簡單'ItemsControl'怎麼樣? – Viv

回答

1

我不命名都與字母和數字控制得到您的問題。像這樣做:

// This is the place where you dynamically create the textboxes, I skipped the part where u add it to wrap panel etc. 
for(int numControls = 0; numControls < 30; numControls++) 
{ 
    Textbox box = new Texbox(); 
    box.name = "textbox" +  numControls.ToString(); 
} 

然後ü找到它只需使用

for(int numBoxes = 0;numBoxes < 30; numBoxes++) 
{ 
Textbox box = WrapPanelTest.FindNyName("textbox" + numBoxes.ToString(); 
//operate on these 
} 

正如迪克Schuerman解決方案: 首先,輔助類,這將有助於我們找到孩子更容易:

class ChildControls 
{ 
    private List<object> lstChildren; 

    public List<object> GetChildren(Visual p_vParent, int p_nLevel) 
    { 
     if (p_vParent == null) 
     { 
      throw new ArgumentNullException("Element {0} is null!", p_vParent.ToString()); 
     } 

     this.lstChildren = new List<object>(); 

     this.GetChildControls(p_vParent, p_nLevel); 

     return this.lstChildren; 

    } 

    private void GetChildControls(Visual p_vParent, int p_nLevel) 
    { 
     int nChildCount = VisualTreeHelper.GetChildrenCount(p_vParent); 

     for (int i = 0; i <= nChildCount - 1; i++) 
     { 
      Visual v = (Visual)VisualTreeHelper.GetChild(p_vParent, i); 

      lstChildren.Add((object)v); 

      if (VisualTreeHelper.GetChildrenCount(v) > 0) 
      { 
       GetChildControls(v, p_nLevel + 1); 
      } 
     } 
    } 
} 

並且你使用這樣的:

  ChildControls ccChildren = new ChildControls(); 

     foreach (object o in ccChildren.GetChildren(WrapPanelTest, 5)) 
     { 
      if (o.GetType() == typeof(TextBox)) 
      { 
       // Do something 
      } 
     } 

GetChildren中的「5」意味着您要挖掘的深度級別。例如:

  • WrapPanelTest
    • 電網
    • 文本框

這會要你到該屬性設置爲3

+0

其因爲當我嘗試在文本框中的文本,名稱往往會以某種方式覆蓋文本並在文本框中顯示空白如果我把一個int.ToString的文本框的名稱,但我想要的是找到最佳方式找到文本框控件。 – user2376998

+0

這些文本框是WrapPanelTest中唯一的控件嗎?另外,**你有嵌套結構嗎?我的意思是:WrapPanelTest中的某種面板,然後是那個裏面的文本框? –

+0

你是對的 – user2376998

1

在你的循環,你是試圖將WrapPanelTest.Children中的所有控件作爲TextBox。 嘗試:

foreach (var control in WrapPanelTest.Children) 
{ 
    if(control.GetType() == typeof(TextBox)) 
     c++; 
} 
+0

好吧,讓我們這樣做:內部WrapPanelTest theres Stackpanel,裏面Stackpanel,theres一個wrappanel,最內層的面板是我添加文本框 – user2376998

+0

我試過你的代碼,它返回0 ...它假設返回7 – user2376998

+0

它將WrappanelTest中的面板作爲控件檢測,因此foreach循環只進行一次。 – user2376998

1

您應該爲這些文本框創建一個命名約定。例如:

int id=1; 
tbox.Name="textbox_"+id.ToString(); 

,然後創建一個功能,如:

TextBox getTextBoxById(int id) 
{ 
    TextBox myTextBox=WrapPanelTest.FindName("textbox_"+id.ToString()) as TextBox; 
    return myTextBox; 
}