将项目值显示为从datagridcomboboxcolumn中选择的特定datagridcolumn,并动态计算每个选择的总数

时间:2017-06-30 00:47:11

标签: c# winforms datagridview datagridviewcolumn datagridviewcombobox

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

组合框也有项目YES,NO,NA(这没有数据表,我只是通过编码combobox.items.add(“是/否/ na”)添加项目。是项目将获得价值取决于列PTS AVAIL并显示在PTS GAIN列上。如果我选​​择否,0将显示在PTS GAIN列中,如果NA,则PTS AVAIL和PTS GAIN都将为0.再次我想如果可能的话计算总实时。

非常感谢任何有关此事的帮助。我正在遇到一条死路,所以,任何人!祝你有美好的一天!顺便说一句,我会发布该程序的截图,如果你想看一个特定的代码块供参考,只需评论。

enter image description here

1 个答案:

答案 0 :(得分:0)

你需要连接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()中的代码放在表单上初始化其他对象的任何位置。