计算列表框项

时间:2016-11-10 20:13:11

标签: c# wpf listbox

我坚持跟随:

我有一个申请表如下:

enter image description here

我为'klant'创建了一个单独的类库,其中包含一个字符串'Naam'和一个整数'Consumpties'并将其链接到我的项目。

当用户添加名称(Naam)和多个消耗(Consumpties)时,这些值将添加到列表框中。

到目前为止,这是我的代码:

private void btnKlantToevoegen_Click(object sender, RoutedEventArgs e)
    {
        List<Klant> klanten = new List<Klant>();

        klanten.Add(new Klant
        {
           Naam = txtKlantNaam.Text,
           Consumpties = int.Parse(txtKlantConsumpties.Text)
        }
           );

            for (int i = 0; i < klanten.Count; i++)
            {

                lbOverzicht.Items.Add(klanten[i]);

            }

我需要计算输入的客户和消费的总和,但我仍然坚持如何正确实现这一目标。

此外,需要设定每个客户的最大消费数量和最大消费总量。

如何称呼它?

我尝试创建一种计算消费总量的方法,但无法完成结果。到目前为止我的代码如下:

int BerekenTotaalConsumpties(int totaalconsumpties)
    {
        totaalconsumpties = 0;
        int consumpties = int.Parse(txtKlantConsumpties.Text);
        for (int i = 0; i <= consumpties; i++)
        {
            totaalconsumpties += Convert.ToInt32(lbOverzicht.Items[i].ToString());
        }
        return totaalconsumpties;
    }

然后,此方法的结果需要放在标签中。我会这样做:

lblOverzicht.Content = BerekenTotaalConsumpties();

Klant课程如下:

 public class Klant
{
    public string Naam;
    public int Consumpties;

    public override string ToString()
    {
        return string.Format("{0} ({1})", this.Naam, this.Consumpties);
    }
}

名称(Naam)如何按字母顺序排序? 直到现在我们还有

lbOverzicht.Items.SortDescriptions.Add(new SortDescription("", ListSortDirection.Ascending));

但这似乎不起作用?

我们如何验证用户是否输入字段Naam中的字母和字段Consumptions中的数字?

3 个答案:

答案 0 :(得分:1)

对于计数,请尝试:

int totalNaams = 0;
int totalConsumpties = 0;
foreach (Klant item in klanten)
{
    totalConsumpties += item.Consumpties;
    totalNaams += 0;
}

至于限制每个客户的Consumpties数量,需要在将其添加到列表框之前完成。只需检查它是否小于或等于你的最大值

为了限制总的Comsumpties,您需要在每次添加ListView后计算新的总数。这可能需要一种不同的计数方法,因此你不需要执行更多次的foreach。

新XAML

<ListView x:Name="lbOverzicht" HorizontalAlignment="Left" Height="200" Margin="435,372,0,0" VerticalAlignment="Top" Width="177">
    <ListView.View>
        <GridView>
            <GridViewColumn DisplayMemberBinding="{Binding Naam}" />
            <GridViewColumn DisplayMemberBinding="{Binding Consumpties}" />
        </GridView>
    </ListView.View>
</ListView>

新代码背后

int totalNaams = 0;
int totalConsumpties = 0;
int consumptiesTotalMax = 0;
int consumptiesMax = 0;
List<Klant> klanten = new List<Klant>();

public class Klant
{
    public string Naam { get; set; }
    public int Consumpties { get; set; }

    public override string ToString()
    {
        return string.Format("{0} ({1})", this.Naam, this.Consumpties);
    }
}

public void btnKlantToevoegen_Click(object sender, RoutedEventArgs e)
{
    int current = int.Parse(txtKlantConsumpties.Text);
    consumptiesTotalMax = int.Parse(txtTotalMax.Text);
    consumptiesMax = int.Parse(txtConsumpMax.Text);

    if (!string.IsNullOrEmpty(txtKlantConsumpties.Text.Trim()) && !string.IsNullOrEmpty(txtKlantNaam.Text.Trim()))
    {
        if (((totalConsumpties + current) <= consumptiesTotalMax) && (current <= consumptiesMax))
        {
            klanten.Add(new Klant
                {
                    Naam = txtKlantNaam.Text,
                    Consumpties = current
                }
            );

            lbOverzicht.ItemsSource = klanten;

            totalConsumpties += current;
            totalNaams += 1;

            CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lbOverzicht.ItemsSource);
            view.SortDescriptions.Add(new SortDescription("Naam", ListSortDirection.Ascending));
        }
    }
}

答案 1 :(得分:1)

使用MVVM的强大功能和CollectionChange的{​​{1}}事件来处理对该集合的任何和所有更改的求和。

在您的视图模型中(符合ObservableCollection)声明这些属性

INotifyPropertyChange

因此,我们列出了// Zehn Kleine Jagermeister! public ObservableCollection<Klant> Overzicht { get { return _Overzicht; } set { _Overzicht = value; OnPropertyChanged(); } } public int AantalKlanten { get { return Overzicht?.Count ?? 0; } } public int AantalConsumpties { get; set; } 和总计。然后在viewmodel的构造函数中,我们分配observable集合并订阅集合事件的更改:

Klant

因此,每当我们从集合中添加或删除某些内容时,我们都会重新计算总数。通过直接调用总计的Overzicht = new ObservableCollection<Klant>(); Overzicht.CollectionChanged += (o, args) => { AantalConsumpties = Overzicht.Sum(klnt => klnt.Consumpties); OnPropertyChanged("AantalConsumpties"); OnPropertyChanged("AantalKlanten"); }; 方法,我们向已绑定到这些属性的XAML控件宣布,值已更改并更新它们以供用户查看。

这是XAML中的绑定

OnPropertyChanged

然后,为了限制添加按钮点击的内容,只需在允许插入(<ListBox ItemsSource="{Binding Overzicht}"/> <TextBlock Text="{Binding AantalKlanten }"/> <TextBlock Text="{Binding AantalConsumpties}"/> )到Overzicht集合之前检查AantalKlantenAantalCompties

下面显示了单击按钮时的添加,最大值为100.您可以根据需要进行更改。

Add

这是if ((myViewModel.AantalConsumpties + newvalue) < 100) myViewModel.Overzicht.Add(new Klant() { Naam = ..., Consumpties = newvalue});

Klant

MVVM新手?有关详细信息,请查看我的快速示例Xaml: ViewModel Main Page Instantiation and Loading Strategy for Easier Binding

答案 2 :(得分:0)

public int NumConsumptionsPerClient(string client) 
{
    var aux = listBox1.Items;
    List<int> consumptions = new List<int>();
    foreach (var i in aux)
    {
        if (i.ToString().Contains(client))
        {
            consumptions.Add(Convert.ToInt32(Regex.Match(i.ToString(), @"\d+").Value)); // only gets numbers
        }
    }
    int sumconsumptions = 0;
    foreach (int k in consumptions)
    {
        sumconsumptions = sumconsumptions + k;
    }
    return sumconsumptions;
}

public int NumConsumptions()
{
    var aux = listBox1.Items;
    List<int> consumptions = new List<int>();
    foreach (var i in aux)
    {
        consumptions.Add(Convert.ToInt32(Regex.Match(i.ToString(), @"\d+").Value)); // only gets numbers
    }
    int sumconsumptions = 0;
    foreach (int k in consumptions)
    {
        sumconsumptions = sumconsumptions + k;
    }
    return sumconsumptions;
}

 public int NumClients()
        {
            return listBox1.Items.Count;            
        }

使用第一种方法,您可以控制最大值。每个客户的消费。 (您修改对象的方法而不是字符串)

第二种和第三种方法很容易理解。

相关问题