清除WPF中多个TextBox对象的内容

时间:2015-04-06 09:59:32

标签: c# wpf

我在WPF中有以下XAML

<Canvas>
    <WrapPanel x:Name="TimeTableMainWrapPanel" Canvas.Left="109" Canvas.Top="195" Height="601" Width="745>
        <TextBox x:Name="txtFirstLctrTime"  Height="24" TextWrapping="Wrap" Width="115"/>
        <TextBox x:Name="txtSecondLctrTime" Height="23" Canvas.Left="594" TextWrapping="Wrap" Canvas.Top="189" Width="115"/>

        <WrapPanel x:Name="TimeTableSubWrapPanel" Canvas.Left="109" Canvas.Top="195" Height="601" Width="745">
            <WrapPanel x:Name="FirstLecture" Background="#00F0F8FF" Height="392" Width="133" Margin="0,0,10,0">
                <TextBox x:Name="txtMondayFirstLctr" Width="133" Margin="0" Height="30" FontSize="13" VerticalContentAlignment="Center"/>
                <TextBox x:Name="txtTuesdayFirstLctr" Width="133" Margin="0,38,0,0" Height="30" FontSize="13" VerticalContentAlignment="Center"/>
            </WrapPanel>

            <WrapPanel x:Name="SecondLecture" Canvas.Top="220" Background="#00F0F8FF" Canvas.Left="270" Height="466" Width="133" Margin="8,0,10,0">
                <TextBox x:Name="txtMondaySecondLctr" Width="133" Margin="0,38,0,0" Height="30" VerticalContentAlignment="Center"></TextBox>
                <TextBox x:Name="txtTuesdaySecondLctr" Width="133" Margin="0,38,0,0" Height="30" VerticalContentAlignment="Center"></TextBox>
            </WrapPanel>
        </WrapPanel>
    </WrapPanel>
</Canvas>

我想在按钮点击时清除所有文本框的内容。为此我正在做

var firsttextboxes = this.FirstLecture.Children.OfType<TextBox>();
var secondtextboxes = this.SecondLecture.Children.OfType<TextBox>();

foreach (var textbox in firsttextboxes)
{
    textbox.Clear();
}

foreach (var textbox in secondtextboxes)
{
    textbox.Clear();
}

有没有更好的方法来实现这一点,而不是使用多个foreach循环?

另外,如何在每个TextBox中输入一个值并移至下一个?

我正在尝试下面的代码,但它在所有TextBox个对象中插入相同的值:

foreach(var a in firsttextboxes ) 
{ 
    foreach(var b in Text) 
    { 
        a.Text = b 
    } 
} 

5 个答案:

答案 0 :(得分:1)

使用Union并合并所有来源。然后预测所有的文本框。

var allTextboxes = firsttextboxes
                    .Union(secondtextboxes)
                    .Union(thirdtextboxes);
                    //And so on
foreach (var textbox in allTextboxes )
{
    textbox.Clear();
}

另一种方法是查看可视树,找出父WrapPanel中的所有TextBox并清除它们。

答案 1 :(得分:1)

我创建了一个Generic方法来做同样的事情。 PerformOperationOnVisualTreeControl方法接受父控件和`Action方法来定义操作。

public static void PerformOperationOnVisualTreeControl<T>(Visual myVisual, Action<T> action)
{
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(myVisual); i++)
        {
            var childVisual = (Visual)VisualTreeHelper.GetChild(myVisual, i);
            if (typeof(T) == childVisual.GetType())
            {
                T control = (T)System.Convert.ChangeType(childVisual, typeof(T));
                action(control);
            }

            PerformOperationOnVisualTreeControl<T>(childVisual, action);
        }
}

您可以调用PerformOperationOnVisualTreeControl方法,如下所示

更新:我创建了一个Queue来更新所有TextBox数据库值。 QueueDequeue逐个重要,并更新TextBox

var dbValues = new Queue<int>(Enumerable.Range(1, 5));
PerformOperationOnVisualTreeControl<TextBox>(this.TimeTableSubWrapPanel, (control) =>
{
    control.Clear();
    if (dbValues.Count > 0)
    {
        control.Text = dbValues.Dequeue().ToString();
    }
});

答案 2 :(得分:0)

void ClearDescendantTextBoxes(Control ctrl)
{
    foreach (Control child in ctrl.Controls)
        if (child is TextBox)
            child.Text = "";
        else ClearDescendantTextBoxes(child);
}

(这适用于winforms。但你可以轻松地为wpf修复它。)

答案 3 :(得分:0)

关于MVVM,我会为负责清除文本框的按钮创建一个命令。

然后我会通过将应该绑定到文本框的可观察属性设置为null来实现该命令。

这消除了通常会成为维护噩梦/上帝阶级的代码隐藏。

答案 4 :(得分:0)

var allTextboxes = this.mainpan.Children.OfType();

        foreach (var textbox in allTextboxes)
        {
            textbox.Clear();
        }
        var allTextboxe = this.mainpan.Children.OfType<ComboBox>();
        foreach (var textbox in allTextboxe)
        {
            textbox.SelectedIndex = 0;
        }