在循环中替换按钮名称字母

时间:2014-03-14 20:47:39

标签: c# for-loop

我正在用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#中做到这一点吗?

2 个答案:

答案 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),但是这适用于发布的场景。