wpf中列表框的值的总和

时间:2013-07-26 11:41:49

标签: c# wpf textbox listbox

我在WPF中有TextBoxListBoxListBox(listAmount)包含一些值,我希望TextBox(txtTotalAmount)中的值总和。

我目前正在使用此代码:

int i = 0;
int sum = 0;

for (i = 0; i < listAmount.Items.Count; i++)
{
    sum = sum + Convert.ToInt32(listAmount.Items[i]);
}

txtTotalAmount.Text = sum.ToString();

我收到了这个错误:

  

无法将'System.Windows.Controls.ListBoxItem'类型的对象强制转换为   输入'System.IConvertible'

我会很高兴你。

5 个答案:

答案 0 :(得分:6)

错误消息说明listAmount.Items[i]返回ListBoxItem类型的实例。该类派生自ContentControl,这就是为什么其Content property应包含您要查找的实际值。

因此,请尝试:

sum += Convert.ToInt32(((ListBoxItem)listAmount.Items[i]).Content);

必须进行类型转换,因为indexer of ItemCollection已输入object


也就是说,您是否尝试使用集合(例如ObservableCollection<int>)来存储您的值并将该集合设置为列表框的ItemsSource?然后,您可以直接从您的集合中获取并总结整数值,而无需转换任何内容。

将此声明添加到窗口以存储整数值列表:

private readonly ObservableCollection<int> values = new ObservableCollection<int>();

然后,在致电InitializeComponents后,分配ItemsSource属性:

listAmount.ItemsSource = values;

随时随地在values列表中添加和删除您的值;列表的内容将始终由列表框反映出来。

要检索这些值的总和,您只需使用以下内容:

int sum = values.Sum();

请注意,using指令需要包含System.Linq namespace才能生效,否则将无法找到Sum method

答案 1 :(得分:3)

我建议另一种方法可以更好地融合WPF / XAML。

在Textbox.Text上使用绑定,并在绑定到的对象中创建属性。在属性的getter中执行数学运算。我会限制每次更改时手动分配Textbox.Text值。绑定是WPF最大的优势之一VS Winforms。

这当然要求您的对象实现INotifyPropertyChanged接口。 http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

编辑:如果您必须在没有绑定的情况下执行此操作,我建议使用LINQ查询进行总结。简单而优雅(对于这个例子,我的ListBox有一个ItemSource,如果是整数则是一个数组。你当然必须使Cast&lt;&gt;适应你正在使用的任何东西。)

  var numbers = new[] { 1, 2, 3, 4, 5, 6 };
  var listBox = new ListBox {ItemsSource = numbers};

  var sum = listBox.Items.Cast<int>().Sum();

答案 2 :(得分:1)

如果你知道它们将永远是整数,你可以使用Linq

 listAmmount.Items.Cast<string>().Sum(x => int.Parse(x)).ToString();

修改

在wpf中测试

textBox1.Text = listBox1.Items.Cast<ListBoxItem>().Sum(x => Convert.ToInt32(x.Content)).ToString();

答案 3 :(得分:-2)

使用:

listAmount.Items[i].ToString()

答案 4 :(得分:-3)

可能有一种更清洁的方式,但是这个

 var items = listAmount.Items;
        int SUM;
        foreach (var item in items)
        {
            int itemvalue = Convert.ToInt32(item.ToString());

            SUM += itemvalue;
        }