我有多个XAML TextBox
es,当TextBox
中的值发生变化时,每个XAML C#
使用动态检查的TextBox
方法来操作数组中的相应值 <TextBox x:Name="_0_0" TextChanged="_x_y_TextChanged"/>
<TextBox x:Name="_0_1" TextChanged="_x_y_TextChanged"/>
<TextBox x:Name="_0_2" TextChanged="_x_y_TextChanged"/>
// And so on.....
调用了该方法。
TextBox
当TextBox
中的值被更改时,每个操作数组中的相应值,使用C#方法动态检查哪个 private void _x_y_TextChanged(object sender, TextChangedEventArgs e)
{
TextBox current = (TextBox)sender;
string currentname = current.Name;
string rowstring = currentname.Substring(1, 1);
string columnstring = currentname.Substring(3, 1);
int row = Convert.ToInt32(rowstring);
int column = Convert.ToInt32(columnstring);
// I've then detected the name of the textbox which has called it...
已调用该方法。
TextBox
因此,此信息可用于动态存储来自TextBox
的相应数组索引中的信息 - 或者您想用它做什么......
我的问题是:
如何创建一个在数组中使用索引位置的方法,调用相关的{{1}}并更新其文本?
答案 0 :(得分:7)
使用FindName(string)
按名称查找文本框,如下所示(其中container
是包含所有文本框的控件):
private void UpdateTextBox(int row, int column, string text)
{
TextBox textBox = container.FindName("_" + row + "_" + column) as TextBox;
if(textbox != null)
{
textbox.Text = text;
}
}
答案 1 :(得分:2)
您可以采用两种方式:
如果要管理大量数据,或者无法预测数组的长度,最好绑定到集合,而不是手动将数据导入和导出数组。如果您创建一个派生自ObservableCollection的类而不是使用数组,那么数据&lt;&gt;你的关系非常简单。
如果您确实需要手动执行此操作,可能最好将索引粘贴到文本框的“标记”字段中。您可以(a)在您的xaml中清楚地看到它,(b)轻松解析它,(c)如果您在此处使用了公式的变体:
Find all controls in WPF Window by type
您可以在窗口中迭代文本框,并通过查看其标记索引找到正确的文本框:
foreach (TextBox t in FindVisualChildren<TextBox>(this))
{
if ((int) t.Tag) == my_index )
{
t.Text = "my_text_goes_here";
}
}
答案 2 :(得分:1)
我建议使用MVVM模式,数据模板和ItemsControl来有效地处理这个问题。
答案 3 :(得分:1)
我会朝着这个问题的答案方向前进: form anchor/dock 简而言之,我将创建一个包含实际值的类,然后创建一个包含信息类的集合。
然后我不会在TextBoxes上使用事件“TextChanged”,而是“嗅探”用于保存文本的Dependency属性的更改。这可以在Dependency Property中轻松完成。
最后,我会使用ItemsControl或ItemsPresenter来显示控件。控件数量将遵循集合中的项目数。