根据每个项目的第一个字符对列表框中的数字进行数学运算

时间:2015-06-05 23:57:29

标签: c# math textbox listbox

我有一个程序可以将项目添加到列表框中。这些项目由一个字符(+, - ,*,/)后跟数字组成。我想让我的程序识别列表框中项目的第一个字符,并进行适当的数学运算。但是,我似乎无法做到正确。我甚至不确定我应该使用什么代码。

只是为了让它更清晰

使用此格式" + 34233"将项目输入名为txtCalculation的文本框中。然后将该值添加到列表框lstDisplay中,因此在5个项目之后它应该如下所示。

+2
+4
/2
-1
+5
*3
total = 21

我想找到一种方法让程序遍历列表并进行数学运算,然后将其作为最终项添加到列表中,如上所示。我已经有了代码将数字添加到列表中并试图将它们添加到一起,然后将它们放在一个名为txtTest的文本框中,但每次添加新数字时txtTest都设置为我添加的最后一个数字到列表框而不是显示这些数字的总数

到目前为止的代码

        double total = 0;
        string line = "";
        if (txtCalculation.Text.Length > 1)
        {

            if (e.KeyChar == (char)Keys.Enter)
            {
                string Number = txtCalculation.Text;
                try
                {
                    switch (Number[0])
                    {
                        case '+':
                            total += Convert.ToInt32(Number.Substring(1));
                            break;
                        case '-':
                            total -= Convert.ToInt32(Number.Substring(1));
                            break;
                    }
                    lstDisplay.Items.Add(Number);
                    txtCalculation.Text = "";
                    txtTest.Text = total.ToString();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error");
                }
            }

如果有人能帮我解决这个问题并向我解释我做错了什么,我真的很感激。

2 个答案:

答案 0 :(得分:1)

我在这方面做了一个小例子:

FIND_IN_SET()

这是视图。没有什么太花哨的,只有ListView与ObservableCollection数字绑定。将显示总数的TextBlock限制为项目计数。因此,每次添加或删除项目时,都会更新。转换器存在于那里,其参数是ListView本身。

WHERE FIND_IN_SET($sub_category, sub_category_id) > 0

再次,我保持简单,没有字符串解析只是为了按时完成,咖啡时间,抱歉。

确实我使用了int,你会收到字符串,解析符号并获取值也是为了继续你的案例切换流程。

以下是代码behing:

<Window x:Class="AddTotalListConverter.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:AddTotalListConverter"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Grid.Resources>
        <local:ComputationConverter x:Key="ComputationConverter"/>
    </Grid.Resources>
    <StackPanel>
        <ListView x:Name="lvNumbers" ItemsSource="{Binding numbers}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Numbers">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
        <StackPanel Orientation="Horizontal" Margin="0,10">
            <TextBlock Text="New Number" Margin="5,0"/>
            <TextBox x:Name="tbNewNumber" MinWidth="50" Margin="5,0"/>
            <Button Content="Add Number" Margin="5,0" Click="btnAddNumber_Click"/>
        </StackPanel>
        <StackPanel Orientation="Horizontal" Margin="0,20"/>
        <TextBlock Text="{Binding numbers.Count, Converter={StaticResource ComputationConverter}, ConverterParameter={x:Reference lvNumbers}}"/>
    </StackPanel>
</Grid>

如果您需要MVVM方法,我可以稍后使用命令并在ViewModel中使用列表进行更新。 我希望这会有所帮助。

答案 1 :(得分:0)

我讨厌假设,但您上面提供的代码似乎是一个方法内部的代码,该方法不是作为代码片段的一部分提供的。如果我的假设是正确的,有两种方法可以解决您的问题。第一种选择是移动你的总数&#34;变量超出方法并给它一个类范围。通过声明变量&#34; total&#34;在您的方法中,每次调用方法时都将其清除为0。赋予类范围应该在每次调用方法/事件时保留变量的值。第二个选项是设置你的&#34;总数&#34;变量到txtTest.Text。您必须将txtTest.Text转换为double。有一些不同的方法可以将字符串转换为double。您可以研究以下方法:double.Parse(string input),double.TryParse(string input,out double output)或Convert.ToDouble(string input)来进行转换。