我正试着用WPF DataGrid做一个7天滚动平均权重计算器。所以基本上,你一周的体重总和除以7=你7天的平均体重。因此,用户将权重放入名为gridListValues的ObservableCollectionsList中,然后将其添加到DataGrid中。7天后,他们在DataGrid的另一个专栏中获得了7天的averageWeight。
问题是,当我在DataGrid中输入权重七次时,我得到的结果是:((6 * weight) / 7)。但实际结果应该是((7 * weight) / 7)。我想这是因为我调用了在实例化对象并将其添加到列表的同时执行计算的方法?不过,我不太确定该如何解决这个问题。代码如下:
private void AddWeightToGridButton_Click(object sender, RoutedEventArgs e)
{
WeightGridValues averageWeight = new WeightGridValues();
if (gridListValues.Count <= 5)
gridListValues.Add(new WeightGridValues { Weight = AddWeightToGrid.Text, Date = Convert.ToString(AddDateToGrid) });
else if (gridListValues.Count >= 6)
{
gridListValues.Add(new WeightGridValues { Weight = AddWeightToGrid.Text, Date = Convert.ToString(AddDateToGrid), SevenDayWeightAverage = SevenDayAverageCalc(averageWeight) });
}
}
private string SevenDayAverageCalc(WeightGridValues averageWeight)
{
decimal sevenDayCalc = 0;
for (int i = 0; i < gridListValues.Count; i++)
{
sevenDayCalc += Convert.ToDecimal(gridListValues[i].Weight);
Convert.ToDecimal(gridListValues[i].SevenDayWeightAverage);
}
sevenDayCalc = sevenDayCalc / 7;
return averageWeight.SevenDayWeightAverage = Convert.ToString(sevenDayCalc);
}
public class WeightGridValues
{
public string Weight { get; set; }
public string Date { get; set; }
public string SevenDayWeightAverage { get; set; }
}XAML:
<DataGrid x:Name="WeightDataGrid" Margin="440,194,10,10" AutoGenerateColumns="False" Grid.RowSpan="2" Grid.ColumnSpan="2">
<DataGrid.Columns>
<DataGridTextColumn IsReadOnly="False" Header=" Date " Binding="{Binding Date, Mode=OneWay}" Width="100"/>
<DataGridTextColumn Header=" Weight " Binding="{Binding Weight}" Width="80"/>
<DataGridTextColumn Header=" 7-Day average " Binding="{Binding SevenDayWeightAverage}" Width="*"/>
</DataGrid.Columns>
</DataGrid>

发布于 2021-05-17 19:18:12
您可以向gridListValues添加一个空的WeightGridValues,然后设置它的各个元素。
gridListValues.Add(new WeightGridValues());
gridListValues[gridListValues.Count-1].Weight = AddWeightToGrid.Text;
gridListValues[gridListValues.Count-1].Date= Convert.ToString(AddDateToGrid);
gridListValues[gridListValues.Count-1].SevenDayWeightAverage = SevenDayAverageCalc(averageWeight)发布于 2021-05-17 20:03:27
作为SevenDayAverageCalc方法的参数,有一种方法可以一起接收和处理新输入的权重。
private void AddWeightToGridButton_Click(object sender, RoutedEventArgs e)
{
WeightGridValues averageWeight = new WeightGridValues();
if (gridListValues.Count <= 5)
{
gridListValues.Add(new WeightGridValues {
Weight = AddWeightToGrid.Text,
Date = Convert.ToString(AddDateToGrid) });
}
else if (gridListValues.Count >= 6)
{
gridListValues.Add(new WeightGridValues {
Weight = AddWeightToGrid.Text,
Date = Convert.ToString(AddDateToGrid),
SevenDayWeightAverage = SevenDayAverageCalc(averageWeight, AddWeightToGrid.Text) });
}
}
而且,在SevenDayAverageCalc方法中使用while语句比使用for语句更好,因为必须为添加的每个新行计算‘7天平均值’。
private string SevenDayAverageCalc(WeightGridValues averageWeight, string newWeight)
{
decimal sevenDayCalc = 0;
int cnt = 1;
int currentRow;
while (cnt <= 6)
{
currentRow = gridListValues.Count - cnt;
sevenDayCalc += Convert.ToDecimal(gridListValues[currentRow].Weight);
Convert.ToDecimal(gridListValues[currentRow].SevenDayWeightAverage);
cnt++;
}
sevenDayCalc = (sevenDayCalc + Convert.ToDecimal(newWeight)) / 7;
return averageWeight.SevenDayWeightAverage = Convert.ToString(sevenDayCalc);
}您可以先在while语句中将现有的6行数据相加,然后添加newWeight并将其除以7。
结果

https://stackoverflow.com/questions/67550827
复制相似问题