【问题标题】:Dropdownlists in GridView not respecting selectionsGridView 中的下拉列表不考虑选择
【发布时间】:2011-12-09 22:56:50
【问题描述】:

在 ASP.NET 页面上,我有一个 gridview,它在其中一个列中包含一个下拉列表。虽然 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,因为我只想在单击按钮 cmdUpdate 时考虑它们选择的值。

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

问题是这样的:无论在任何下拉列表中选择什么项目,我的页面都认为它们中的每一个都设置为“Frank”,即第一个项目。此外,如果我在for循环的顶部放置一个断点,表示为“调查代码”,然后与页面交互如下:

  1. 为不同的行选择不同的下拉列表选项。
  2. 点击更新按钮。

...我的调试代码告诉我没有选择任何项目! 没有一个!!我可以在页面上查看 2 个是和 3 个否,而我在 VS2008 中的调试工具告诉我每个下拉列表都没有选择任何内容 .

这怎么可能? (注意:我已经尝试过将 EnableViewState 设置为 true,并且在页眉中甚至没有提到 EnableViewState。)

谢谢。

【问题讨论】:

    标签: c# asp.net gridview drop-down-menu


    【解决方案1】:

    对此进行打击。用 this 替换基于 for 的索引

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

    &lt;&lt; use SelectedItem.Value - I think this will solve your problem &gt;&gt;

    更新:

    要更新 ddl 的选定索引,您需要进行回发。启用自动回发=真。但是在这里,您提到您不想要自动回发,因为这是唯一的解决方法,所以将网格视图放在更新面板中以抑制回发

    【讨论】:

    • 不错的想法,但我已经在调试中尝试过,每个 ddl 的 SelectedIndex 都是 0,不管我选择什么。
    • 我不反对使用自动回发,我只是不想每次用户进行选择时都访问服务器,因为可能有多达几十个下拉列表需要在一次。我会试一试。谢谢,阿米特。
    【解决方案2】:

    在服务器端

    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()" />
    

    Dropdown 以这种方式绑定

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

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

    【讨论】:

      【解决方案3】:

      我认为您在每次回帖时都重新绑定了网格,这将重新加载整个数据以及下拉菜单。例如。请在对 gridview 进行数据绑定之前检查 if(!page.IsPostBack)。 如果这不是问题,请告诉我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-22
        相关资源
        最近更新 更多