【问题标题】:How to insert a DropDownList inside the GridView's first header如何在 GridView 的第一个标题中插入 DropDownList
【发布时间】:2014-10-22 20:53:43
【问题描述】:

我有一个 GridView,其中有一些数据,还有另一个 HTML 表格,上面有 DropDownList 来过滤 GridView。唯一的问题是,因为它们是两个单独的表,所以列不匹配。为了弥补这一点,在 RowCreated 方法中,我添加了以下示例:

protected void yourTasksGV_RowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.Header)
    {
        GridView hGrid = (GridView)sender;
        GridViewRow gvrRow = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Insert);
        TableHeaderCell tcCell = new TableHeaderCell();
        tcCell.Text = @"<asp:DropDownList ID='ddlTaskName2' CssClass='chosen-select' DataSourceID='dsPopulateTaskName2' AutoPostBack='true' DataValueField='Task Name' runat='server' Width='100%' Font-Size='11px' AppendDataBoundItems='true' OnSelectedIndexChanged='ddlTaskName_onSelectIndexChanged'>
                                    <asp:ListItem Text='All' Value='%'></asp:ListItem>
                                </asp:DropDownList>
                                <asp:SqlDataSource ID='sPopulateTaskName2' runat='server' ConnectionString='<%$ ConnectionStrings:gvConnString %>' SelectCommand=\""SELECT [actionname] from [OnBase].[hsi].[action]\""></asp:SqlDataSource>";
        tcCell.ColumnSpan = 1;
        gvrRow.Cells.Add(tcCell);

        TableHeaderCell tcCell2 = new TableHeaderCell();
        tcCell2.Text = "TEST #2";
        tcCell2.ColumnSpan = 1;
        gvrRow.Cells.Add(tcCell2);


        yourTasksGV.Controls[0].Controls.AddAt(0, gvrRow);
    }
}

创建 GridView 时,我没有看到任何 DropDownList。

我用于过滤的表格是这样的:

<table class="taskGridView" runat="server">
    <tr>
        <td>
            <asp:DropDownList ID="ddlTaskName" CssClass="chosen-select" DataSourceID="dsPopulateTaskName" AutoPostBack="true" DataValueField="Task Name" runat="server" Width="100%" Font-Size="11px" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlTaskName_onSelectIndexChanged">
                <asp:ListItem Text="All" Value="%"></asp:ListItem>
            </asp:DropDownList>
            <asp:SqlDataSource ID="dsPopulateTaskName" runat="server" ConnectionString="<%$ ConnectionStrings:gvConnString %>" SelectCommand=""></asp:SqlDataSource>
        </td>
        <td>
            <asp:DropDownList ID="ddlService" CssClass="chosen-select" DataSourceID="dsPopulateService" AutoPostBack="true" DataValueField="Service" runat="server" Width="100%" Font-Size="11px" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlService_onSelectIndexChanged">
                <asp:ListItem Text="All" Value="%"></asp:ListItem>
            </asp:DropDownList>
            <asp:SqlDataSource ID="dsPopulateService" runat="server" ConnectionString="<%$ ConnectionStrings:gvConnString %>" SelectCommand=""></asp:SqlDataSource>
        </td>
        <td>
            <asp:DropDownList ID="ddlStatus" CssClass="chosen-select" DataSourceID="dsPopulateStatus" AutoPostBack="true" DataValueField="Status" runat="server" Width="100%" Font-Size="11px" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlStatus_onSelectIndexChanged">
                <asp:ListItem Text="All" Value="%"></asp:ListItem>
            </asp:DropDownList>
            <asp:SqlDataSource ID="dsPopulateStatus" runat="server" ConnectionString="<%$ ConnectionStrings:gvConnString %>" SelectCommand=""></asp:SqlDataSource>
        </td>
        <td>
            <asp:DropDownList ID="ddlDueDate" CssClass="chosen-select" DataSourceID="dsPopulateDueDate" AutoPostBack="true" DataValueField="Due Date" runat="server" Width="100%" Font-Size="11px" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlDueDate_onSelectIndexChanged">
                <asp:ListItem Text="All" Value="%"></asp:ListItem>
            </asp:DropDownList>
            <asp:SqlDataSource ID="dsPopulateDueDate" runat="server" ConnectionString="<%$ ConnectionStrings:gvConnString %>" SelectCommand=""></asp:SqlDataSource>
        </td>
        <td>
            <asp:DropDownList ID="ddlOwner" CssClass="chosen-select" DataSourceID="dsPopulateOwner" AutoPostBack="true" DataValueField="Owner" runat="server" Width="100%" Font-Size="11px" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlOwner_onSelectIndexChanged">
                <asp:ListItem Text="All" Value="%"></asp:ListItem>
            </asp:DropDownList>
            <asp:SqlDataSource ID="dsPopulateOwner" runat="server" ConnectionString="<%$ ConnectionStrings:gvConnString %>" SelectCommand=""></asp:SqlDataSource>
        </td>
        <td>
            <asp:DropDownList ID="ddlClient" CssClass="chosen-select" DataSourceID="dsPopulateClient" AutoPostBack="true" DataValueField="Client" runat="server" Width="100%" Font-Size="11px" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlClient_onSelectIndexChanged">
                <asp:ListItem Text="All" Value="%"></asp:ListItem>
            </asp:DropDownList>
            <asp:SqlDataSource ID="dsPopulateClient" runat="server" ConnectionString="<%$ ConnectionStrings:gvConnString %>" SelectCommand=""></asp:SqlDataSource>
        </td>
        <td>
            <asp:DropDownList ID="ddlSite" CssClass="chosen-select" DataSourceID="dsPopulateSite" AutoPostBack="true" DataValueField="Site" runat="server" Width="100%" Font-Size="11px" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlSite_onSelectIndexChanged">
                <asp:ListItem Text="All" Value="%"></asp:ListItem>
            </asp:DropDownList>
            <asp:SqlDataSource ID="dsPopulateSite" runat="server" ConnectionString="<%$ ConnectionStrings:gvConnString %>" SelectCommand=""></asp:SqlDataSource>
        </td>
        <td>
            <asp:DropDownList ID="ddlPractice" CssClass="chosen-select" DataSourceID="dsPopulatePractice" AutoPostBack="true" DataValueField="Practice" runat="server" Width="100%" Font-Size="11px" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlPractice_onSelectIndexChanged">
                <asp:ListItem Text="All" Value="%"></asp:ListItem>
            </asp:DropDownList>
            <asp:SqlDataSource ID="dsPopulatePractice" runat="server" ConnectionString="<%$ ConnectionStrings:gvConnString %>" SelectCommand=""></asp:SqlDataSource>
        </td>
        <td>
            <asp:DropDownList ID="ddlProvider" CssClass="chosen-select" DataSourceID="dsPopulateProvider" AutoPostBack="true" DataValueField="Provider" runat="server" Width="100%" Font-Size="11px" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlProvider_onSelectIndexChanged">
                <asp:ListItem Text="All" Value="%"></asp:ListItem>
            </asp:DropDownList>
            <asp:SqlDataSource ID="dsPopulateProvider" runat="server" ConnectionString="<%$ ConnectionStrings:gvConnString %>" SelectCommand=""></asp:SqlDataSource>
        </td>
    </tr>
</table>

我正在从 Page_Load 上的代码隐藏中填充 SelectCommand。我还在 Page_Load 上调用另一个函数,它引用了 DropDownList 但我得到了一个The name 'DropDownList ID' does not exist in current content

我的 GridView:

<asp:GridView ShowHeaderWhenEmpty="false" AlternatingRowStyle-BackColor="#EBE9E9" AutoGenerateColumns="false" OnSorting="yourTasksGV_Sorting" AllowSorting="true" ID="yourTasksGV" runat="server" ClientIDMode="Static" EmptyDataText="You currently have no tasks assigned to you" OnRowDataBound="yourTasksGV_RowDataBound" OnRowCreated="yourTasksGV_RowCreated">
    <Columns>
        <asp:HyperLinkField Target="_self" DataNavigateUrlFields="Task Detail" DataTextField="Task Name" DataNavigateUrlFormatString="" HeaderText="Task Detail" SortExpression="Task Name" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Service" HeaderText="Service" SortExpression="Service" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Status" HeaderText="Status" SortExpression="Status" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Due Date" HeaderText="Due" SortExpression="Due Date" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Owner" HeaderText="Owner" SortExpression="Owner" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Client" HeaderText="Client" SortExpression="Client" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Site" HeaderText="Site" SortExpression="Site" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Practice" HeaderText="Practice" SortExpression="Practice" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Provider" HeaderText="Provider" SortExpression="Provider" ItemStyle-CssClass="taskTableColumn" />
    </Columns>
</asp:GridView>

我要做的是获取 DropDownList 表并将其插入到 GridView HEADER 中,就在生成的 Header 正上方。

正如您在下图中看到的那样,DropDownList 应该去的空标题在那里,但我什么也没看到。这就是我想将 DropDownList 与 all 选项放在一起的地方。

【问题讨论】:

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


    【解决方案1】:

    与其在单元格文本中添加标记,在页面生命周期中不会像在 aspx 源中声明它一样正确评估,而是将控件添加到现有控件的 Controls 集合.

    例如,

    DropDownList ddlTaskName2 = new DropDownList();
    tcCell.Controls.Add(ddlTaskName2);
    

    这应该可以让您解决下拉菜单不显示的问题,如下所示:

    下面是您可以使用的最小工作示例,它向 GridView 标题单元格添加下拉列表。

    标记:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="GridViewHeaderControl.aspx.cs"
        Inherits="WebApplication7_JQuery.GridViewHeaderControl" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:GridView runat="server" ID="gvMain" OnRowCreated="gvMain_RowCreated" />
        </div>
        </form>
    </body>
    </html>
    

    代码隐藏:

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                gvMain.DataSource = new List<object> { new { ID = 1, Name = "First" }, new { ID = 2, Name = "Second" } };
                gvMain.DataBind();
            }
        }
    
        protected void gvMain_RowCreated(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.Header)
            {
                GridView hGrid = (GridView)sender;
                GridViewRow gvrRow = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Insert);
    
                DropDownList ddl = new DropDownList();
                ddl.Items.Add("Option 1");
    
                TableHeaderCell tcCell = new TableHeaderCell();
                tcCell.Controls.Add(ddl);
                gvrRow.Cells.Add(tcCell);
                gvMain.Controls[0].Controls.AddAt(0, gvrRow);
            }            
        }
    

    根据您问题中作为单元格文本加载的标记,根据需要设置下拉列表的更多属性。

    您可能需要在设置 datasourceid 后显式编码 ddl.DataBind(),具体取决于您何时进行其他绑定。

    这里的ddl是动态创建的;但是,您可能希望在您的标记中声明它,以便它获得一个设计时变量,您可以在代码隐藏中的任何位置引用以进行绑定和其他目的:

    <asp:GridView runat="server" ID="gvMain" OnRowCreated="gvMain_RowCreated" />
    <asp:DropDownList runat="server" ID="ddlTaskName" />
    

    tcCell.Controls.Add(ddlTaskName);
    

    【讨论】:

    • 所以保持表格原样,然后添加控件?困惑。
    • @SiKni8 我已经编辑了我的答案以添加一个您可以使用的最小工作示例。
    • 我会做一些改变,看看我能做些什么:) 谢谢。
    • 给你的问题 (ddl = ddlTaskName),如果我在我的 Page_Load 事件中使用这一行 (ddlTaskName.SelectedIndex &gt; 0) 现在给我一个错误:The name 'ddlTaskName' does not exist in the current context 因为我实际上是在创建它我的RowCreated 函数,我该如何解决?我认为一旦它起作用了,我应该很高兴。谢谢
    • 其实多亏了你,我才能将 DropDownList 放在 GridView 中,现在将其绑定在一起:/ 这是 PAGE_LOAD 事件和 PullData 函数,它绑定 DropDownList 并填充 GridView (@987654321 @)。如果你能告诉我如何填充在 RowCreated 中创建的 DropDownList 以及如何从 PullData 函数引用 DDL,我很高兴! :)
    猜你喜欢
    • 2017-04-19
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2016-04-29
    • 2014-02-05
    相关资源
    最近更新 更多