我坚持跟随:
我有一个申请表如下:
我为'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中的数字?
答案 0 :(得分:1)
对于计数,请尝试:
int totalNaams = 0;
int totalConsumpties = 0;
foreach (Klant item in klanten)
{
totalConsumpties += item.Consumpties;
totalNaams += 0;
}
至于限制每个客户的Consumpties数量,需要在将其添加到列表框之前完成。只需检查它是否小于或等于你的最大值
为了限制总的Comsumpties,您需要在每次添加ListView后计算新的总数。这可能需要一种不同的计数方法,因此你不需要执行更多次的foreach。
<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集合之前检查AantalKlanten
和AantalCompties
。
下面显示了单击按钮时的添加,最大值为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;
}
使用第一种方法,您可以控制最大值。每个客户的消费。 (您修改对象的方法而不是字符串)
第二种和第三种方法很容易理解。