将项目值显示到从datagridcombobox列中选择的特定数据网格列并动态计算每个选择的总数

问题描述:

我正在使用c#开发Windows窗体并使用datagridview对象。我差不多完成了,但是我在将项目值显示到在datagridview中的所有组合框中选择的特定列(PTS GAIN COLUMN)中遇到问题。数据从数据库中选择(编码)。我想要显示所选项目值的列(PTS GAIN COLUMN)在数据库中没有条目。它是空的。我希望每次从每行中的组合单元格中选择一个项目时,它都会将值显示到特定列(PTS GAIN COLUMN)并动态/实时地计算总数(我想在label.text中显示结果)将项目值显示到从datagridcombobox列中选择的特定数据网格列并动态计算每个选择的总数

此外,组合框单元格有YES,NO,NA(没有数据表单,我只是通过编写combobox.items.add(“yes/no/na”)添加了项目。在PTS AVAIL列上显示,并在PTS GAIN列上显示,如果我选择no,0将显示在PTS GAIN列中,如果NA不显示,则PTS AVAIL和PTS GAIN都将为0.同样我想尽可能计算总实数

对这件事的任何帮助都非常感谢,我正在遇到一条死路,所以请任何人!祝你有美好的一天!顺便说一句,我会张贴专业版的截图克,如果你想看到一个特定的代码块供参考,只需评论。

enter image description here

+0

您是否考虑过检查组合框的值何时发生变化,并在那时进行描述? – JohnG

+0

这是我第一次编码,我发现datagridview对象很复杂。你想让我给你看一些代码吗? @JohnG –

+0

没有时间......尝试查找datagridviews,“CellValueChanged”事件。尝试一下,如果它不起作用...发布你已经尝试过。 – JohnG

您将需要连接了2个事件来实现这一点,但在大多数情况下这是很容易的。

private void MyInitializeComponent() 
{ 
    dg.CurrentCellDirtyStateChanged += Dg_CurrentCellDirtyStateChanged; 
    dg.CellValueChanged += Dg_CellValueChanged; 

    this.CalculateTotals(); 
} 

private void Dg_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
{ 
    if (dg.Columns[e.ColumnIndex].Name == "Choices") 
    { 
     switch (dg.Rows[e.RowIndex].Cells["Choices"].Value.ToString()) 
     { 
      case ("Yes"): 
      { 
       dg.Rows[e.RowIndex].Cells["PointsGained"].Value = 
        dg.Rows[dg.CurrentCell.RowIndex].Cells["PointsAvailable"].Value; 
       break; 
      } 
      case ("No"): 
      { 
       dg.Rows[e.RowIndex].Cells["PointsGained"].Value = 0; 
       break; 
      } 
      case ("NA"): 
      { 
       dg.Rows[e.RowIndex].Cells["PointsGained"].Value = "NA"; 
       break; 
      } 
     } 

     this.CalculateTotals(); 
    } 
} 

private void Dg_CurrentCellDirtyStateChanged(object sender, EventArgs e) 
{ 
    if ((dg.Columns[dg.CurrentCell.ColumnIndex].Name == "Choices") && 
     (dg.IsCurrentCellDirty)) 
    { 
     dg.CommitEdit(DataGridViewDataErrorContexts.Commit); 
    } 
} 

private void CalculateTotals() 
{ 
    var totalPointsGained = dg.Rows.Cast<DataGridViewRow>() 
     .Where(a => a.Cells["PointsGained"].Value?.ToString() != "NA") 
     .Sum(a => Convert.ToInt32(a.Cells["PointsGained"].Value)); 

    var totalPointsAvailable = dg.Rows.Cast<DataGridViewRow>() 
     .Where(a => a.Cells["PointsAvailable"].Value?.ToString() != "NA") 
     .Sum(a => Convert.ToInt32(a.Cells["PointsAvailable"].Value)); 

    lblTotalPointsGained.Text = "Total Points Gained: " + totalPointsGained; 
    lblTotalAvailable.Text = "Total Points Available: " + totalPointsAvailable; 
} 

无论你在表格上初始化其他对象,你可以把我在MyInitializeComponent()代码。