C# gridview控件中的Dropdownlist仅选择第一个索引

C# gridview控件中的Dropdownlist仅选择第一个索引,c#,asp.net,gridview,drop-down-menu,C#,Asp.net,Gridview,Drop Down Menu,我在gridview控件中有一个dropdownlist控件。网格视图控件和下拉列表连接到数据源 提交时,下拉控件仅拾取第一个索引的值 以下是ASPX代码: <asp:GridView ID="gvQuestions" runat="server" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None"> <AlternatingRowStyle BackC

我在gridview控件中有一个dropdownlist控件。网格视图控件和下拉列表连接到数据源

提交时,下拉控件仅拾取第一个索引的值

以下是ASPX代码:

<asp:GridView ID="gvQuestions" runat="server" AutoGenerateColumns="False" CellPadding="4"
    ForeColor="#333333" GridLines="None">
    <AlternatingRowStyle BackColor="White" />
    <Columns>
        <asp:BoundField DataField="qID" HeaderText="QID" />
        <asp:BoundField DataField="Question" HeaderText="Questions" />
        <asp:TemplateField HeaderText="Response">
            <ItemTemplate>
                <asp:DropDownList ID="ddlResponse" runat="server" AppendDataBoundItems="True" AutoPostBack="false"
                    DataSourceID="ResponseSDS" DataTextField="response" DataValueField="responseID"
                    CssClass="ddlStyle" OnSelectedIndexChanged="ddlResponse_SelectedIndexChanged">
                    <%--<asp:ListItem Enabled="True" Selected="false"><--Selected Value--></asp:ListItem>--%>
                </asp:DropDownList>
                <asp:SqlDataSource ID="ResponseSDS" runat="server" ConnectionString="<%$ ConnectionStrings:HSELeadershipSurveyConnectionString %>"
                    SelectCommand="SELECT * FROM [tblResponse]"></asp:SqlDataSource>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
    <EditRowStyle BackColor="#2461BF" />
    <FooterStyle BackColor="#0085C9" Font-Bold="True" ForeColor="White" />
    <HeaderStyle BackColor="#0085C9" Font-Bold="True" ForeColor="White" />
    <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
    <RowStyle BackColor="#EFF3FB" />
    <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
    <SortedAscendingCellStyle BackColor="#F5F7FB" />
    <SortedAscendingHeaderStyle BackColor="#6D95E1" />
    <SortedDescendingCellStyle BackColor="#E9EBEF" />
    <SortedDescendingHeaderStyle BackColor="#4870BE" />
</asp:GridView>

按钮单击事件已触发回发,因此dropdownlist值已重置为默认的第一个索引。还要注意,页面加载事件将发生在按钮单击事件之前。

从qID获得的行索引不正确。qId的值可以从1开始,但网格视图的行索引从0开始。 因此,当qID(根据代码的行索引)为1时,您认为它正在访问第一行,但它访问第二行(行索引为1),最后在第二行拾取下拉列表的选定值

因此,您使用了错误的值来获取行索引。如果你不相信我的答案,试着用下面的测试测试你的代码,它会在第一行给你下拉选择的值

DropDownList ddl = (DropDownList)gvQuestions.Rows[0].FindControl("ddlResponse");

responses = ddl.SelectedValue.ToString();
修复:使用下面的代码来处理按钮单击事件,希望能有所帮助:

protected void btnSubmit_Click(object sender, EventArgs e)
{
    // Get the responses for the questions
    foreach (GridViewRow masterData in gvQuestions.Rows)
    {
        // the actual way to get your row index
        int rowIndex = masterData.RowIndex;
        //qID = (int)gvQuestions.DataKeys[(masterData.RowIndex)].Value;
        //response = ((DropDownList)masterData.FindControl("ddlResponse")).SelectedValue.ToString();
        DropDownList ddl = (DropDownList)gvQuestions.Rows[rowIndex ].FindControl("ddlResponse");
        responses = ddl.SelectedValue.ToString();
    }

}

如何将数据绑定到gvQuestions?//在此处显示问题网格gvQuestions.DataSource=surveyQuestions.SelectQuestions();gvQuestions.DataBind();gvQuestions.Visible=true;}我昨天意识到了我的错误,所以在foreach循环外使用了一个计数器qID=0来完成一项工作。然后递增loop.foreach(gvQuestions.Rows中的GridViewRow主数据){DropDownList ddl=(DropDownList)gvQuestions.Rows[qID].FindControl(“DDResponse”);responses=ddl.SelectedValue.ToString();qID++;//将条目提交到数据库反馈。插入调查(全名、部门、部门、电子邮件、qID、回复、回复、评估);}
protected void btnSubmit_Click(object sender, EventArgs e)
{
    // Get the responses for the questions
    foreach (GridViewRow masterData in gvQuestions.Rows)
    {
        // the actual way to get your row index
        int rowIndex = masterData.RowIndex;
        //qID = (int)gvQuestions.DataKeys[(masterData.RowIndex)].Value;
        //response = ((DropDownList)masterData.FindControl("ddlResponse")).SelectedValue.ToString();
        DropDownList ddl = (DropDownList)gvQuestions.Rows[rowIndex ].FindControl("ddlResponse");
        responses = ddl.SelectedValue.ToString();
    }

}