【问题标题】:Sum of DropDownLists values inside a GridViewGridView 内 DropDownLists 值的总和
【发布时间】:2014-10-22 15:32:36
【问题描述】:

希望有人能帮我解决这个问题。我有一个具有 x 行数的 GridView,每行有 4 列,由 3 个 DropDownLists 和一个标签组成,用于保存 3 个 DropDownLists 的选定值的总和。我的问题是我该如何做到这一点?我已经为 DropDownLists 尝试了 SelectedIndexChanged 路由,但没有得到我想要的结果。这些值不是被添加,而是被下一个选择覆盖。我究竟做错了什么?到目前为止,这是我所拥有的:


    protected void ddlSelectedIndexChanged(object sender, EventArgs e)
    {
        foreach (GridViewRow row in gvStuRoster.Rows)
        {
            double scores = 0;

            DropDownList ddlFocus = (DropDownList)row.FindControl("ddlFocus");
            DropDownList ddlEvidence = (DropDownList)row.FindControl("ddlEvidence");
            DropDownList ddlConventions = (DropDownList)row.FindControl("ddlConventions");
            //DropDownList ddlScores = (DropDownList)row.FindControl("ddlScores");
            Label lblScores = (Label)row.FindControl("lblScores");

            if (ddlFocus.SelectedIndex > 0 && ddlFocus.SelectedValue != "-1")
            {
                scores += Convert.ToDouble(ddlFocus.SelectedValue);
            }
            else if (ddlFocus.SelectedValue == "-1")
            {
                scores = -1;
            }

            if (ddlEvidence.SelectedIndex > 0 && ddlEvidence.SelectedValue != "-1")
            {
                scores += Convert.ToDouble(ddlEvidence.SelectedValue);
            }
            else if (ddlEvidence.SelectedValue == "-1")
            {
                scores = -1;
            }

            if (ddlConventions.SelectedIndex > 0 && ddlConventions.SelectedValue != "-1")
            {
                scores += Convert.ToDouble(ddlConventions.SelectedValue);
            }
            else if (ddlConventions.SelectedValue == "-1")
            {
                scores = -1;
            }

            lblScores.Text = scores == -1 ? "" : Convert.ToString(scores);
      }
    }

更新

在将scoreslblScores 标签移入内部后,一切都按预期工作,除了在任何 DropDownList 的第一个选择中,除了同一行中的那个之外,所有其他 Labels 值在GridView 设置为 0。为什么会这样?

提前感谢您的帮助!

【问题讨论】:

    标签: c# asp.net gridview


    【解决方案1】:

    您的scores 变量在每次请求时重置为 0(下拉菜单的每次更改)。然后,您只需将scores 设置为当前更改下拉列表的值。如果下拉列表有选择,您可以做的是获取每个请求的每个下拉列表的值。假设您的每个下拉菜单的第一项设置为“选择一个值”或其他内容,您可以检查SelectedIndex 是否大于 0,如果是,则表示有选择。

    foreach (GridViewRow row in gvStuRoster.Rows)
    {
        double scores = 0;
    
        DropDownList ddlFocus = (DropDownList)row.FindControl("ddlFocus");
        DropDownList ddlEvidence = (DropDownList)row.FindControl("ddlEvidence");
        DropDownList ddlConventions = (DropDownList)row.FindControl("ddlConventions");
        Label lblScores = (Label)row.FindControl("lblScores");
    
        if (ddlFocus.SelectedIndex > 0)
        {
            scores += Convert.ToDouble(ddlFocus.SelectedValue);
        }
    
        if (ddlEvidence.SelectedIndex > 0)
        {
            scores += Convert.ToDouble(ddlEvidence.SelectedValue);
        }
    
        if (ddlConventions.SelectedIndex > 0)
        {
            scores += Convert.ToDouble(ddlConventions.SelectedValue);
        }
    
        lblScores.Text = scores == 0 ? "" : Convert.ToString(scores);
    }  
    

    【讨论】:

    • 戴夫,现在我遇到了另一个问题。看起来分数变量在整个网格中是持久的。第一行的总数被添加到第二行的总数中。
    • 您需要在循环内移动scores 变量,并在循环内设置lblTeacher。我已经编辑了我的答案以显示这一点。 lblTeacher 声明在哪里?
    • Dave,lblTeacher 是我用于测试目的的 GridView 之外的标签。实际上,分数的总和应该设置为第 4 列中的标签。我将更新我的 OP 以反映这一点......在循环内移动 scores 变量后,无论我选择什么,我都会返回零值。
    • 我已根据您的更新更新了我的答案。如果您在循环内设置lblScores.Text,它应该可以按预期工作。如果没有,请设置断点并在单步执行代码时检查分数的值。
    • 我在我的 OP 中添加了一个 update 部分,说明代码更新后发生了什么。
    【解决方案2】:

    在 Dave 的帮助下,我得到了我想要的结果。这是我拥有的最终代码:

    protected void ddlSelectedIndexChanged(object sender, EventArgs e)
    {
        foreach (GridViewRow row in gvStuRoster.Rows)
        {
            double scores = 0;
    
            DropDownList ddlFocus = (DropDownList)row.FindControl("ddlFocus");
            DropDownList ddlEvidence = (DropDownList)row.FindControl("ddlEvidence");
            DropDownList ddlConventions = (DropDownList)row.FindControl("ddlConventions");
            DropDownList ddlScores = (DropDownList)row.FindControl("ddlScores");
            Label lblScores = (Label)row.FindControl("lblScores");
    
            if (ddlFocus.SelectedIndex > 0 && ddlFocus.SelectedValue != "-1")
            {
                scores += Convert.ToDouble(ddlFocus.SelectedValue);
            }
    
            if (ddlEvidence.SelectedIndex > 0 && ddlEvidence.SelectedValue != "-1")
            {
                scores += Convert.ToDouble(ddlEvidence.SelectedValue);
            }
    
            if (ddlConventions.SelectedIndex > 0 && ddlConventions.SelectedValue != "-1")
            {
                scores += Convert.ToDouble(ddlConventions.SelectedValue);
            }
    
            ddlScores.SelectedValue = scores == 0 ? "" : Convert.ToString(scores);
        }
    }
    

    再次感谢戴夫!

    【讨论】:

      猜你喜欢
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2015-08-07
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多