我正在用C#编写代码来开发Windows Phone 8应用程序。
我有8个按钮命名(f1,f2,f3 ...... f8)
现在,我想将Text值添加到数组中。我知道怎么做 但它需要8行代码。
示例:
Numbers[0] = Convert.ToInt32(f1.Content);
Numbers[1] = Convert.ToInt32(f2.Content);
.
.
.
Numbers[7] = Convert.ToInt32(f8.Content);
有没有办法写一个循环来为我做这个过程?像这样:
for(int i=0; i < 8 ; i++)
Numbers[i] = Convert.ToInt32(fX.Content);
其中X以值1(f1)开始,然后是2,依此类推。 我有什么方法可以在C#中做到这一点吗?
答案 0 :(得分:2)
假设你有一个名为MainGrid
的网格控件(它没有 是一个网格控件,那么任何东西都可以工作。只需相应地调整你的代码)
int[] numbers = MainGrid.Children.OfType<Button>()
.Select(x => Convert.ToInt32(x.Content)).ToArray();
这里是一些与上述代码一起使用的示例XAML
<Grid x:Name="MainGrid">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Button Grid.Row="0" Grid.Column="0" Content="1" x:Name="F1" />
<Button Grid.Row="1" Grid.Column="0" Content="2" x:Name="F2" />
<Button Grid.Row="2" Grid.Column="0" Content="3" x:Name="F3" />
<Button Grid.Row="3" Grid.Column="0" Content="Do not count me" />
</Grid>
正如LordTakkera在评论中指出的那样,如果您在同一个父容器中有其他按钮,而您没有想要获取其值,则此代码将失败。在这种情况下,您需要一个额外的Where()
子句,如下所示:
int[] numbers = MainGrid.Children.OfType<Button>()
.Where(x => x.Name.Contains("F"))
.Select(x => Convert.ToInt32(x.Content))
.ToArray();
由于LINQ可能令人困惑并且不清楚如果您不熟悉它,这是一种更传统的做同样事情的方法:
//Unless you have a specific reason for wanting an int array, a list is easier to work with
List<int> numbers = new List<int>();
//Use .OfType<>() So that you don't have to cast each control to a button in the loop
foreach(Button button in MainGrid.Children.OfType<Button>())
{
//If it's not one of our named buttons, continue the loop
if(! button.Name.StartsWith("F")) continue;
int buttonValue = Convert.ToInt32(button.Content);
numbers.Add(buttonValue);
}
答案 1 :(得分:0)
我假设你在代码支持中,因为你可以&#34;可以&#34;使用控件名称。
为此,请使用FindName函数(MSDN):
for(int i=0; i < 8 ; i++)
Numbers[i] = Convert.ToInt32(((Button)FindName("f" + i)).Content);
这不是非常XAML / WPF / MVVM这样做的方式,所以你可能想看看设置绑定到数字列表的项目控件(你可以调用sum),但是这适用于发布的场景。