C# 从动态填充的堆栈面板读取子级

C# 从动态填充的堆栈面板读取子级,c#,xaml,C#,Xaml,因此,我用数据输入字段动态填充嵌套的堆栈面板,在内部StackPanel中,是一个继承StackPanel但包含数据类型和其他元数据的类,我为标签添加一个文本块,并为动态生成的第二个字段添加一个文本块,该字段可能是TextBox,一个ComboBox,复选框或其他。输入完成后,我需要捕获数据并将其移动到类中进行处理。如何从内部StackPannel获取数据?我在children中尝试了foreach x,但这会为不同类型的每个对象抛出一个错误。为了简化,我只显示文本框和复选框 private v

因此,我用数据输入字段动态填充嵌套的堆栈面板,在内部
StackPanel
中,是一个继承
StackPanel
但包含数据类型和其他元数据的类,我为标签添加一个文本块,并为动态生成的第二个字段添加一个文本块,该字段可能是
TextBox
,一个
ComboBox
复选框
或其他。输入完成后,我需要捕获数据并将其移动到类中进行处理。如何从内部
StackPannel
获取数据?我在children中尝试了
foreach x
,但这会为不同类型的每个对象抛出一个错误。为了简化,我只显示
文本框
复选框

private void _LoadData_Click(object sender, RoutedEventArgs e)
    {

        List<IEnteredData> enteredData= new List<IEnteredData>();
        enteredData= _ExtractEnteredData(FirsColumn, enteredData);
        enteredData= _ExtractEnteredData(SecondColumn, enteredData);
        foo(enteredData);
    }

    private List<IEnteredData> _ExtractEnteredData(StackPanel thisColumn, List<IEnteredData> enteredData)
    {
        foreach (StackPanelBatchInput entry in thisColumn.Children)
        {
            string enteredValue= null;
            foreach (TextBox textinput in entry.Children)
                enteredValue = textinput.Text;
            foreach (CheckBox checkBox in entry.Children)
            {
                if (checkBox.IsChecked  == true)
                    enteredValue = "true";
                else
                    enteredValue = "false";
            }

            if (enteredValue != null)
                enteredData.Add(AssignValueType(entry, enteredValue));
        }

        return enteredData;
    }
private void\u LoadData\u单击(对象发送方,路由目标)
{
列表输入数据=新列表();
enteredData=_extractedEnteredData(第一列,enteredData);
enteredData=_extractedEnteredData(第二列,enteredData);
foo(输入数据);
}
私有列表_extractedEnteredData(StackPanel This Column,List enteredData)
{
foreach(此Column.Children中的StackPanelBatchInput条目)
{
字符串enteredValue=null;
foreach(entry.Children中的文本框textinput)
enteredValue=textinput.Text;
foreach(entry.Children中的复选框)
{
如果(checkBox.IsChecked==true)
enteredValue=“true”;
其他的
enteredValue=“false”;
}
如果(输入值!=null)
添加(AssignValueType(entry,enteredValue));
}
返回输入的数据;
}

我认为问题在于,当代码进入foreach循环时,他取出StackPanel的第一个子项,并将其转换为StackPanelBatchInput,例如。但是当子对象不是StackPanelBatchInput类型时,您将得到一个异常

对于foreach循环,请尝试以下方法:

foreach (StackPanelBatchInput entry in thisColumn.Children.OfType<StackPanelBatchInput>())
{
     ...
     foreach (TextBox textinput in entry.Children.OfType<TextBox>())
        enteredValue = textinput.Text;
     ...
}
foreach(此列中的StackPanelBatchInput条目.Children.OfType())
{
...
foreach(entry.Children.OfType()中的TextBox textinput)
enteredValue=textinput.Text;
...
}
这将过滤指定类型的元素(例如文本框、复选框等)。有关更多信息,请访问

如果这不能解决您的问题,您可以发布您的XAML代码和异常请。这将对读者更有帮助