我在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
}
}
答案 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
数据库值。 Queue
将Dequeue
逐个重要,并更新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;
}