【问题标题】:C# WPF DataGrid populating DataGrid problemC# WPF DataGrid 填充 DataGrid 问题
【发布时间】:2021-05-15 20:10:27
【问题描述】:

我正在尝试在 WPF DataGrid 中制作一个 7 天滚动平均体重计算器。所以基本上你一周的体重总和除以 7 = 你 7 天的平均体重。因此,用户将他们的权重放在名为gridListValuesObservableCollectionsList 中,然后将其添加到DataGrid 中。 7 天后,他们在 DataGrid 的另一列中获得 7 天的平均重量。

问题是,当我在 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>

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

    您可以在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)
    

    【讨论】:

      【解决方案2】:

      作为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语句中已有的六行数据相加,再将newWeight相加除以7。

      结果

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多