C# GridView中的下拉列表不考虑选择

C# GridView中的下拉列表不考虑选择,c#,asp.net,gridview,drop-down-menu,C#,Asp.net,Gridview,Drop Down Menu,在ASP.NET页面上,我有一个gridview,其中一列中包含一个dropdownlist。gridview中的其他列是数据绑定的,但下拉列表不是,它只包含3个预设值Frank、Yes和No。Frank被用作示例,这样我就不会从首选的空白选项中获得错误的读数 <asp:GridView ID="testGrid" runat="server" AutoGenerateColumns="False"> <Columns> <asp:Bound

在ASP.NET页面上,我有一个gridview,其中一列中包含一个dropdownlist。gridview中的其他列是数据绑定的,但下拉列表不是,它只包含3个预设值Frank、Yes和No。Frank被用作示例,这样我就不会从首选的空白选项中获得错误的读数

<asp:GridView ID="testGrid" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:BoundField DataField="Code1" HeaderText="Code1" />
        <asp:BoundField DataField="Code2" HeaderText="Code2" />
        <asp:TemplateField HeaderText="Like Frank?">
            <ItemTemplate>
                <asp:DropDownList runat="server" ID="ddlLikeFrank">
                    <asp:ListItem>Frank</asp:ListItem>
                    <asp:ListItem>Yes</asp:ListItem>
                    <asp:ListItem>No</asp:ListItem>
                </asp:DropDownList>
            </ItemTemplate>
            <ItemStyle HorizontalAlign="Center" />
        </asp:TemplateField>
        <asp:HyperLinkField ... HeaderText="File" />
    </Columns>
</asp:GridView>
<br />
<asp:Button ID="cmdUpdate" runat="server" Text="Update" OnClick="cmdUpdate_Click" /></div>
我不需要AutoPostBack在这些下拉列表中,因为我只想在点击按钮CMDUpUPDATE时考虑他们的选择值。
protected void cmdUpdate_Click(object sender, EventArgs e)
{
    bool likesFrank = false;

    string selected = "";
    DropDownList ddl = null;
    GridViewRow current = null;
    // Go through each row and check the dropdown list.
    for (int i = 0; i < testGrid.Rows.Count; i++)
    {
        current = testGrid.Rows[i];
        ...
        ddl = (DropDownList)(current.FindControl("ddlLikeFrank"));

        /* THIS FOR LOOP IS WAS USED FOR INVESTIGATING THIS ISSUE*/
        for (int j = 0; j < ddl.Items.Count; j++)
        {
            if (ddl.Items[j].Selected)
            {
                continue;
            }
        }           

        selected = ddl.SelectedItem.Value;
        switch (selected)
        {
            case LIKE: // "Yes"
                likesFrank = true;
                break;
            case DONT_LIKE: // "No"
                likesFrank = false;
                break;
            default: // If nothing is selected in the drop-down list, move on.
                continue;
        } // end switch block

        /* USE THE DERIVED BOOLS HERE */
   } // end for loop on grid rows
} // end method cmdUpdateClick
问题是:无论在任何DropDownList中选择了什么项目,我的页面都认为它们中的每一个都设置为Frank,即第一个项目。此外,如果我将断点放在表示为调查代码的for循环顶部,然后按如下方式与页面交互:

为不同的行选择不同的dropdownlist选项。 单击更新按钮。 。。。我的调试代码告诉我没有选择任何项目!一个也没有!!我可以在页面上看到2个是和3个否,我在VS2008中的调试工具告诉我,每个dropdownlist都没有选择任何内容

这怎么可能呢?注意:我在EnableViewState设置为true的情况下尝试了这个方法,并且在页面标题中甚至没有提到EnableViewState


谢谢。

试试这个。将基于索引的替换为此

foreach(GridViewRow row in grid.Rows)
{
   var ddlVal = ((DropDownList)row.FindControl("yourId")).SelectedItem.Value;
}
>

更新:

要更新ddl的选定索引,需要执行回发。启用自动回邮=真。但是在这里,您已经提到您不想要自动回发,因为这是唯一的解决方法,所以将gridview放在updatepanel中以禁止服务器端的回发

protected void btnSaveRankChanges_Click(object sender, EventArgs e)
        {
            foreach (GridViewRow grv in GridViewRankChanges.Rows)
            {
DropDownList dropDownChangeRank = (DropDownList)grv.FindControl("DropDownListRank");
   StudentInfoObject.RankID = Convert.ToInt32(dropDownChangeRank.SelectedValue);
}
}
网格中

<asp:TemplateField HeaderText="Select New Rank">
                                <ItemTemplate>
                                    <asp:DropDownList ID="DropDownListRank" runat="server">
                                    </asp:DropDownList>
                                </ItemTemplate>
                            </asp:TemplateField>
点击按钮

 <asp:Button ID="btnSaveRankChanges" runat="server" Text="Submit" ValidationGroup="RankChanges"
                        class="accordionHeader" Height="27px" OnClick="btnSaveRankChanges_Click" OnClientClick="LoadImage()" />
下拉列表以这种方式绑定

/// <summary>
        /// bind dropdown with rank in grid
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GridViewRankChanges_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            DropDownList drdList;
            // Nested DropDownList Control reference is passed to the DrdList object. This will allow you access the properties of dropdownlist placed inside the GridView Template column.
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                //bind dropdown rank
                drdList = (DropDownList)e.Row.FindControl("DropDownListRank");
                drdList.DataSource = RankList.GetRankList(false);
                drdList.DataTextField = "Rank";
                drdList.DataValueField = "RankID";
                drdList.DataBind();
                drdList.Items.Insert(0, new ListItem("Select", "0"));

            }
        }

它对我有用,希望对你也有帮助。

我认为你正在重新绑定每个帖子的网格,这将重新加载整个数据以及下拉列表。例如,请检查一下!在对gridview进行数据绑定之前,page.IsPostBack。
如果这不是问题,请告诉我。

不错的想法,但我在调试中尝试过,每个ddl的SelectedIndex为0,无论我选择什么。我不反对使用autopostback,我只是不想每次用户做出选择时都点击服务器,因为一次可能有几十个下拉列表需要选择。我试试看。谢谢,阿米特。