WPF C#从面板内的面板中查找控件

时间:2013-07-19 11:55:23

标签: c# wpf textbox controls panel

我有一些动态创建的文本框,如果我想找到面板中的文本框,最好的方法是找到它吗?

我在线搜索,有些人通过FindName说我们可以找到我们的控件但是为了我需要给我的每个文本框一个名字,在WPF中,即使我把int放在一个名字也必须带有字母而不是int。 ToString它会搞砸。但是如果我输了字母,我很难用字母找到它们,数字就可以了,因为我可以从00开始一直到+1,但我不能这样做。

我在动态创建的WrapPanel中动态创建了文本框,我在动态创建的stackPanel中添加动态创建的WrapPanel然后我将stackkpanel添加到我在xaml端创建的WrapPanel

如果你问我为什么需要这么多面板,因为这是我能让我看起来更好的唯一方法,因为我从数据库中检索信息并显示它的方式。

以下是我的代码的样子(我将其缩短,因为它太长了):

       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循环中的TextBox txtbox):

enter image description here

3 个答案:

答案 0 :(得分:1)

在循环中,您尝试将WrapPanelTest.Children中的所有控件作为TextBox。 尝试:

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

答案 1 :(得分:1)

您应该为这些文本框创建命名约定。例如:

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

然后创建一个类似的函数:

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

答案 2 :(得分: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
}

在Dick 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。