C# GridView中DropDownList值的总和

C# GridView中DropDownList值的总和,c#,asp.net,gridview,C#,Asp.net,Gridview,希望有人能帮我解决这个问题。我有一个x行的GridView,每行有4列,包括3个DropDownList和一个标签,用于保存3个DropDownList的选定值之和。我的问题是如何做到这一点?我尝试了DropDownList的SelectedIndexChanged路线,但没有得到想要的结果。这些值不是被添加,而是被下一个选择覆盖。我做错了什么?以下是我目前掌握的情况: protected void ddlSelectedIndexChanged(object sender, Even

希望有人能帮我解决这个问题。我有一个x行的GridView,每行有4列,包括3个DropDownList和一个标签,用于保存3个DropDownList的选定值之和。我的问题是如何做到这一点?我尝试了DropDownList的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);
      }
    }
更新

在将
分数
lblScores
标签移到内部后,除第一次选择任何DropDownList(同一行中的一个除外)时,GridView中的所有其他标签值均设置为0外,所有其他标签均按预期工作。为什么会这样


提前感谢您的帮助

您的
得分
变量在每次请求时(每次更改下拉列表)都重置为0。然后,您只需将
分数
设置为当前更改下拉列表的值。如果下拉列表中有选择项,则可以获取每个请求的每个下拉列表的值。假设每个下拉列表的第一项都设置为“选择值”或其他内容,则可以检查
SelectedIndex
是否大于0,如果大于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);
}  

在戴夫的帮助下,我得到了我想要的结果。以下是我的最终代码:

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);
    }
}

再次感谢你,戴夫

戴夫,现在我遇到了另一个问题。看起来score变量在整个网格中都是持久的。第一行的总计将添加到第二行的总计中。您需要在循环内移动
scores
变量,并在循环内设置
lblTeacher
。我编辑了我的答案来展示这一点。
lblTeacher
声明在哪里?Dave,
lblTeacher
是一个标签,它位于我用于测试目的的GridView之外。实际上,分数总和应该设置为第4列中的标签。我将更新我的OP以反映这一点……在循环中移动
scores
变量后,无论我选择什么,我都会返回一个零值。我已根据您的更新更新了我的答案。如果您在循环中设置
lblScores.Text
,它应该可以正常工作。如果没有,设置一个断点,并在逐步完成代码时检查分数值。我在OP中添加了一个更新部分,说明代码更新后的情况。