【问题标题】:How to update the DropDownList based on the filtered GridView如何根据过滤后的 GridView 更新 DropDownList
【发布时间】:2014-10-13 04:21:23
【问题描述】:

我有以下代码,它是 GridView,在它上面我有 DropDownList,它允许我过滤:

<table class="taskGridView">
    <tr>
        <td style="width: 25%;">
            <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="SELECT DISTINCT [ATTR2739] 'Task Name' FROM HSI.RMOBJECTINSTANCE1224 CT INNER JOIN HSI.RMOBJECTINSTANCE1232 S ON CT.ATTR2846 = S.ATTR2821 INNER JOIN HSI.USERACCOUNT UA ON S.FK2852 = (UA.USERNUM * -1) WHERE CT.ACTIVESTATUS = 0"></asp:SqlDataSource>
        </td>
        <td style="width: 20%;">
            <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="SELECT DISTINCT [ATTR2846] 'Service' FROM HSI.RMOBJECTINSTANCE1224 CT INNER JOIN HSI.RMOBJECTINSTANCE1232 S ON CT.ATTR2846 = S.ATTR2821 INNER JOIN HSI.USERACCOUNT UA ON S.FK2852 = (UA.USERNUM * -1) WHERE CT.ACTIVESTATUS = 0"></asp:SqlDataSource>
        </td>
        <td style="width: 11%;">
            <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="SELECT DISTINCT [ATTR2812] 'Status' FROM HSI.RMOBJECTINSTANCE1224 CT INNER JOIN HSI.RMOBJECTINSTANCE1232 S ON CT.ATTR2846 = S.ATTR2821 INNER JOIN HSI.USERACCOUNT UA ON S.FK2852 = (UA.USERNUM * -1) WHERE CT.ACTIVESTATUS = 0"></asp:SqlDataSource>
        </td>
        <td style="width: 14%;">
            <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="SELECT DISTINCT CONVERT(VARCHAR(14), [ATTR2752], 110) 'Due Date' FROM HSI.RMOBJECTINSTANCE1224 CT INNER JOIN HSI.RMOBJECTINSTANCE1232 S ON CT.ATTR2846 = S.ATTR2821 INNER JOIN HSI.USERACCOUNT UA ON S.FK2852 = (UA.USERNUM * -1) WHERE CT.ACTIVESTATUS = 0"></asp:SqlDataSource>
        </td>
        <td style="width: 15%;">
            <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="SELECT DISTINCT [REALNAME] 'Owner' FROM HSI.RMOBJECTINSTANCE1224 CT INNER JOIN HSI.RMOBJECTINSTANCE1232 S ON CT.ATTR2846 = S.ATTR2821 INNER JOIN HSI.USERACCOUNT UA ON S.FK2852 = (UA.USERNUM * -1) WHERE CT.ACTIVESTATUS = 0"></asp:SqlDataSource>
        </td>
        <td style="width: 15%;">
            <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="SELECT DISTINCT [ATTR2799] 'Client' FROM HSI.RMOBJECTINSTANCE1224 CT INNER JOIN HSI.RMOBJECTINSTANCE1232 S ON CT.ATTR2846 = S.ATTR2821 INNER JOIN HSI.USERACCOUNT UA ON S.FK2852 = (UA.USERNUM * -1) WHERE CT.ACTIVESTATUS = 0"></asp:SqlDataSource>
        </td>
    </tr>
</table>
<asp:GridView ShowHeaderWhenEmpty="false" AlternatingRowStyle-BackColor="#EBE9E9" AutoGenerateColumns="false" OnSorting="yourTasksGV_Sorting" AllowSorting="true" ID="yourTasksGV" runat="server" ClientIDMode="Static" EmptyDataText="There is no data to display" OnRowDataBound="yourTasksGV_RowDataBound" OnRowCreated="yourTasksGV_RowCreated">
    <Columns>
        <asp:HyperLinkField Target="_blank" DataNavigateUrlFields="Task Detail" DataTextField="Task Name" DataNavigateUrlFormatString="" HeaderText="Task Detail" SortExpression="Task Name" ItemStyle-Width="25%" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Service" HeaderText="Service" SortExpression="Service" ItemStyle-Width="20%" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Status" HeaderText="Status" SortExpression="Status" ItemStyle-Width="10%" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Due Date" HeaderText="Due Date" SortExpression="Due Date" ItemStyle-Width="15%" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Owner" HeaderText="Owner" SortExpression="Owner" ItemStyle-Width="15%" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Client" HeaderText="Client" SortExpression="Client" ItemStyle-Width="15%" ItemStyle-CssClass="taskTableColumn" />
    </Columns>
</asp:GridView>

这是允许我填充和过滤表格的代码:

public void PullData(string sortExp, string sortDir)
{
    string query = "";
    DataTable taskData = new DataTable();
    connString = @""; //my connection string
    if (ddlTaskName.SelectedIndex > 0)
    {
        strClause += " AND CT.ATTR2739 = '" + ddlTaskName.SelectedItem.Text + "'";
    }
    else
    {
        strClause += " AND CT.ATTR2739 LIKE '%'";
    }
    if (ddlService.SelectedIndex > 0)
    {
        strClause += " AND CT.ATTR2846 = '" + ddlService.SelectedItem.Text + "'";
    }
    else
    {
        strClause += " AND CT.ATTR2846 LIKE '%'";
    }
    if (ddlStatus.SelectedIndex > 0)
    {
        strClause += " AND CT.ATTR2812 = '" + ddlStatus.SelectedItem.Text + "'";
    }
    else
    {
        strClause += " AND CT.ATTR2812 LIKE '%'";
    }
    if (ddlDueDate.SelectedIndex > 0)
    {
        strClause += " AND CONVERT(VARCHAR(14), CT.ATTR2752, 110) = '" + ddlDueDate.SelectedItem.Text + "'";
    }
    else
    {
        strClause += " AND CONVERT(VARCHAR(14), CT.ATTR2752, 110) LIKE '%'";
    }
    if (ddlOwner.SelectedIndex > 0)
    {
        strClause += " AND UA.REALNAME = '" + ddlOwner.SelectedItem.Text + "'";
    }
    else
    {
        strClause += " AND UA.REALNAME LIKE '%'";
    }
    if (ddlClient.SelectedIndex > 0)
    {
        strClause += " AND CT.ATTR2799 = '" + ddlClient.SelectedItem.Text + "'";
    }
    else
    {
        strClause += " AND CT.ATTR2799 LIKE '%'";
    }

    if (ddlTaskName.SelectedIndex == 0 && ddlService.SelectedIndex == 0 && ddlStatus.SelectedIndex == 0 && ddlDueDate.SelectedIndex == 0 && ddlOwner.SelectedIndex == 0 && ddlClient.SelectedIndex == 0)
    {
        query = strMainQuery + " WHERE CT.ACTIVESTATUS = 0";
    }
    else
    {
        query = strMainQuery + " WHERE CT.ACTIVESTATUS = 0" + strClause;
    }

    using (SqlConnection conn = new SqlConnection(connString))
    {
        try
        {
            SqlCommand cmd = new SqlCommand(query, conn);

            // create data adapter
            SqlDataAdapter da = new SqlDataAdapter(query, conn);
            // this will query your database and return the result to your datatable

            DataSet myDataSet = new DataSet();
            da.Fill(myDataSet);

            DataView myDataView = new DataView();
            myDataView = myDataSet.Tables[0].DefaultView;

            if (sortExp != string.Empty)
            {
                //MessageBox.Show(sortExp);
                //MessageBox.Show(sortDir);
                myDataView.Sort = string.Format("{0} {1}", sortExp, sortDir);
            }

            yourTasksGV.DataSource = myDataView;
            yourTasksGV.DataBind();

            TasksUpdatePanel.Update();

            conn.Close();
        }
        catch (Exception ex)
        {
            string error = ex.Message;
        }
    }
}
protected void ddlTaskName_onSelectIndexChanged(object sender, EventArgs e)
{
    PullData(ViewState["sortExp"].ToString(), ViewState["sortOrder"].ToString());
}
protected void ddlOwner_onSelectIndexChanged(object sender, EventArgs e)
{
    PullData(ViewState["sortExp"].ToString(), ViewState["sortOrder"].ToString());
}
protected void ddlService_onSelectIndexChanged(object sender, EventArgs e)
{
    PullData(ViewState["sortExp"].ToString(), ViewState["sortOrder"].ToString());
}
protected void ddlStatus_onSelectIndexChanged(object sender, EventArgs e)
{
    PullData(ViewState["sortExp"].ToString(), ViewState["sortOrder"].ToString());
}
protected void ddlDueDate_onSelectIndexChanged(object sender, EventArgs e)
{
    PullData(ViewState["sortExp"].ToString(), ViewState["sortOrder"].ToString());
}
protected void ddlClient_onSelectIndexChanged(object sender, EventArgs e)
{
    PullData(ViewState["sortExp"].ToString(), ViewState["sortOrder"].ToString());
}

public string sortOrder
{
    get
    {
        if (ViewState["sortOrder"].ToString() == "Desc")
        {
            ViewState["sortOrder"] = "Asc";
        }
        else
        {
            ViewState["sortOrder"] = "Desc";
        }

        return ViewState["sortOrder"].ToString();
    }
    set
    {
        ViewState["sortOrder"] = value;
    }
}

现在发生的情况是当页面加载时,GridView 被填充,DropDownList 也被填充。当我从DropDownList 之一过滤GridView 时,如何修改我的ASP.net 页面或后面的代码,以便根据过滤的GridView 更改DropDownList 的其余部分?

现在DropDownList 是硬编码的,但我希望它是动态的,所以DropDownList 显示来自更新的GridView 的数据。

更新:我将PullData 函数更新为:

public void PullData(string sortExp, string sortDir)
        {
            string query = "";
            DataTable taskData = new DataTable();
            connString = @""; //connection string
            if (ddlTaskName.SelectedIndex > 0)
            {
                strClause += " AND CT.ATTR2739 = '" + ddlTaskName.SelectedItem.Text + "'";
            }
            else
            {
                strClause += " AND CT.ATTR2739 LIKE '%'";
            }
            if (ddlService.SelectedIndex > 0)
            {
                strClause += " AND CT.ATTR2846 = '" + ddlService.SelectedItem.Text + "'";
            }
            else
            {
                strClause += " AND CT.ATTR2846 LIKE '%'";
            }
            if (ddlStatus.SelectedIndex > 0)
            {
                strClause += " AND CT.ATTR2812 = '" + ddlStatus.SelectedItem.Text + "'";
            }
            else
            {
                strClause += " AND CT.ATTR2812 LIKE '%'";
            }
            if (ddlDueDate.SelectedIndex > 0)
            {
                strClause += " AND CONVERT(VARCHAR(14), CT.ATTR2752, 110) = '" + ddlDueDate.SelectedItem.Text + "'";
            }
            else
            {
                strClause += " AND CONVERT(VARCHAR(14), CT.ATTR2752, 110) LIKE '%'";
            }
            if (ddlOwner.SelectedIndex > 0)
            {
                strClause += " AND UA.REALNAME = '" + ddlOwner.SelectedItem.Text + "'";
            }
            else
            {
                strClause += " AND UA.REALNAME LIKE '%'";
            }
            if (ddlClient.SelectedIndex > 0)
            {
                strClause += " AND C.ATTR2815 = '" + ddlClient.SelectedItem.Text + "'";
            }
            else
            {
                strClause += " AND C.ATTR2815 LIKE '%'";
            }
            if (ddlSite.SelectedIndex > 0)
            {
                strClause += " AND SI.ATTR2819 = '" + ddlSite.SelectedItem.Text + "'";
            }
            else
            {
                strClause += " AND SI.ATTR2819 LIKE '%'";
            }
            if (ddlPractice.SelectedIndex > 0)
            {
                strClause += " AND PR.ATTR2817 = '" + ddlPractice.SelectedItem.Text + "'";
            }
            else
            {
                strClause += " AND PR.ATTR2817 LIKE '%'";
            }
            if (ddlProvider.SelectedIndex > 0)
            {
                strClause += " AND P.ATTR2919 = '" + ddlProvider.SelectedItem.Text + "'";
            }
            else
            {
                strClause += " AND P.ATTR2919 LIKE '%'";
            }


            if (ddlTaskName.SelectedIndex == 0 && ddlService.SelectedIndex == 0 && ddlStatus.SelectedIndex == 0 && ddlDueDate.SelectedIndex == 0 && ddlOwner.SelectedIndex == 0 && ddlClient.SelectedIndex == 0 && ddlSite.SelectedIndex == 0 && ddlPractice.SelectedIndex == 0 && ddlProvider.SelectedIndex == 0)
            {
                query = strMainQuery + " WHERE CT.ACTIVESTATUS = 0";
            }
            else
            {
                query = strMainQuery + " WHERE CT.ACTIVESTATUS = 0" + strClause;
            }

            using (SqlConnection conn = new SqlConnection(connString))
            {
                try
                {
                    SqlCommand cmd = new SqlCommand(query, conn);

                    // create data adapter
                    SqlDataAdapter da = new SqlDataAdapter(query, conn);
                    // this will query your database and return the result to your datatable

                    DataSet myDataSet = new DataSet();
                    da.Fill(myDataSet);

                    myDataView = new DataView();
                    myDataView = myDataSet.Tables[0].DefaultView;

                    if (sortExp != string.Empty)
                    {
                        //MessageBox.Show(sortExp);
                        //MessageBox.Show(sortDir);
                        myDataView.Sort = string.Format("{0} {1}", sortExp, sortDir);
                    }

                    yourTasksGV.DataSource = myDataView;
                    yourTasksGV.DataBind();

                    DataTable dt = myDataView.ToTable(true, "Task Name");
                    var rows = (from DataRow dRow in dt.Rows select new { Name = dRow["Task Name"], ID = dRow["Task Detail"] }).Distinct();
                    ddlTaskName.DataSource = rows;
                    ddlTaskName.DataTextField = "Task Name";
                    ddlTaskName.DataValueField = "Task Detail";
                    ddlTaskName.DataBind();

                    TasksUpdatePanel.Update();

                    conn.Close();
                }
                catch (Exception ex)
                {
                    string error = ex.Message;
                }
            }
        }

失败并出现此错误:

{System.InvalidOperationException: Both DataSource and DataSourceID are defined on 'ddlTaskName'.  Remove one definition.
   at System.Web.UI.WebControls.DataBoundControl.EnsureSingleDataSource()
   at System.Web.UI.WebControls.DataBoundControl.ConnectToDataSourceView()
   at System.Web.UI.WebControls.DataBoundControl.GetData()
   at System.Web.UI.WebControls.ListControl.OnDataBinding(EventArgs e)
   at System.Web.UI.WebControls.ListControl.PerformSelect()
   at System.Web.UI.WebControls.BaseDataBoundControl.DataBind()
   at OB.Pages.YT.PullData(String sortExp, String sortDir) in Tasks.aspx.cs:line 210}

【问题讨论】:

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


    【解决方案1】:

    根据您的问题,我了解您希望将每个下拉列表与相应的 gridview 列相关联。如果我是对的,您可以这样做

        ddlTaskName.DataSource = myDataView;
        ddlTaskName.DataTextField = "Name";//Name of column which you want to display as text
        ddlTaskName.DataValueField = "ID";//Name of column which you want to be Value of dropdown list items.
        ddlTaskName.DataBind();
    

    您必须为 PullData 方法中的每个下拉菜单执行此操作。

    更新 1

    如果您的 DataValueFiled 和 DataTextFeild 相同,您可以尝试以下两种方法

        DataTable dt = myDataView.ToTable(true, "Name");
        ddlTaskName.DataSource = dt;
        ddlTaskName.DataTextField = "Name";
        ddlTaskName.DataValueField = "Name";
        ddlTaskName.DataBind(); 
    

    这只会选择一列,即名称列。如果你有不同的 DataValueField 和 DataTextFeild,你可以试试这个

    var rows = (from DataRow dRow in dt.Rows select new { Name = dRow["Name"], ID = dRow["ID"] }).Distinct();
     ddlTaskName.DataSource = rows;
        ddlTaskName.DataTextField = "Name";
        ddlTaskName.DataValueField = "ID";
        ddlTaskName.DataBind();
    

    ============================更新2===============

    好的,给你

    现在您的第一个下拉菜单将如下所示

    <asp:DropDownList ID="ddlTaskName" CssClass="chosen-select" AutoPostBack="true" runat="server" Width="100%" Font-Size="11px" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlTaskName_onSelectIndexChanged"></asp:DropDownList>
    

    现在在页面加载时,您将使用您想要的任何数据填充它

        ddlTaskName.DataSource = "your dataset ot datatable or dataview name";
        ddlTaskName.DataTextField = "Name";
        ddlTaskName.DataValueField = "ID";
        ddlTaskName.DataBind();
    

    在拉数据方法中你会这样做

     var rows = (from DataRow dRow in dt.Rows select new { Name = dRow["Name"], ID = dRow["ID"] }).Distinct();
        ddlTaskName.DataSource = rows;
        ddlTaskName.DataTextField = "Name";
        ddlTaskName.DataValueField = "ID";
        ddlTaskName.DataBind();
    

    这里的 dt 是 DataTable 对象,如果你正在填充一个数据集,你可以像这样使用 myDataSet.Tables[0] 而不是 dt。

    要添加“全部”选项,您可以这样做

    ddlTest.Items.Insert(0, new ListItem("All"));
    

    这将在顶部插入“全部”,您可以更改其位置。

    【讨论】:

    • 谢谢。我想会是这样,但我需要有 DropDownList 才能像在 ASP.net 页面代码中那样具有 DISTINCT。有什么办法吗?
    • 假设 GridView 有 20 次“FIX THIS”条目,但 DropDownList 应该只有一个“FIX THIS”作为条目。你的代码会这样做吗?或者如果 GridView 有 20 行“FIX THIS”,它会在 DropDownList 中显示 20 次?
    • 哇,我什至没有看到更新。谢谢...我会测试一下! dt 来自哪里?我对这两段代码感到困惑。只有第一列显示链接为IDNAME,每隔一列 ValueField 和 TextField 相同
    • 我用新的PullData 函数和收到的错误更新了我的问题。请记住,我在页面加载时调用PullData 来填充GridView,然后每次调用它来排序和更改DropDownList
    • 您收到此错误是因为您已经定义了 DataSourceID="dsPopulateTaskName" 并且您还从后面的代码中绑定了下拉列表,因此您需要删除一个我会说如果您想在下拉列表中有不同的值而不是从下拉列表中删除 DataSourceID="dsPopulateTaskName" 并从后面的代码绑定(我提供给您的代码)。您必须为每个想要具有不同值的下拉列表执行此操作。
    猜你喜欢
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多