如何更新基于该过滤GridView中的DropDownList [英] How to update the DropDownList based on the filtered GridView

查看:326
本文介绍了如何更新基于该过滤GridView中的DropDownList的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下的code这是一个 GridView控件和右上面我所的DropDownList ,允许我来过滤:

 <表类=taskGridView>
    &所述; TR>
        < TD风格=宽度:25%;>
            < ASP:DropDownList的ID =ddlTask​​Name的CssClass =选择选的DataSourceID =dsPopulateTaskName的AutoPostBack =真DataValueField =任务名称=服务器WIDTH =100%FONT-SIZE =11像素AppendDataBoundItems =真OnSelectedIndexChanged =ddlTask​​Name_onSelectIndexChanged>
                < ASP:ListItem的文本=所有VALUE =%>< / ASP:ListItem的>
            < / ASP:DropDownList的>
            < ASP:SqlDataSource的ID =dsPopulateTaskName=服务器的ConnectionString =<%$的ConnectionStrings:gvConnString%>中的SelectCommand =SELECT DISTINCT [ATTR2739]任务名称FROM HSI.RMOBJECTINSTANCE1224 CT INNER JOIN HSI.RMOBJECTINSTANCE1232 S于CT.ATTR2846 = S.ATTR2821 INNER JOIN HSI.USERACCOUNT UA ON S.FK2852 =(UA.USERNUM * -1) WHERE CT.ACTIVESTATUS = 0>< / ASP:SqlDataSource的>
        < / TD>
        < TD风格=宽度:20%;>
            < ASP:DropDownList的ID =ddlService的CssClass =选择选的DataSourceID =dsPopulateService的AutoPostBack =真DataValueField =服务=服务器WIDTH =100%FONT-SIZE =11像素 AppendDataBoundItems =真OnSelectedIndexChanged =ddlService_onSelectIndexChanged>
                < ASP:ListItem的文本=所有VALUE =%>< / ASP:ListItem的>
            < / ASP:DropDownList的>
            < ASP:SqlDataSource的ID =dsPopulateService=服务器的ConnectionString =<%$的ConnectionStrings:gvConnString%>中的SelectCommand =SELECT DISTINCT [ATTR2846]'服务'FROM HSI.RMOBJECTINSTANCE1224 CT INNER JOIN HSI.RMOBJECTINSTANCE1232 S于CT.ATTR2846 = S.ATTR2821 INNER JOIN HSI.USERACCOUNT UA ON S.FK2852 =(UA.USERNUM * -1),其中CT.ACTIVESTATUS = 0>< / ASP:SqlDataSource的>
        < / TD>
        < TD风格=宽度:11%;>
            < ASP:DropDownList的ID =ddlStatus的CssClass =选择选的DataSourceID =dsPopulateStatus的AutoPostBack =真DataValueField =状态=服务器WIDTH =100%FONT-SIZE =11像素 AppendDataBoundItems =真OnSelectedIndexChanged =ddlStatus_onSelectIndexChanged>
                < ASP:ListItem的文本=所有VALUE =%>< / ASP:ListItem的>
            < / ASP:DropDownList的>
            < ASP:SqlDataSource的ID =dsPopulateStatus=服务器的ConnectionString =<%$的ConnectionStrings:gvConnString%>中的SelectCommand =SELECT DISTINCT [ATTR2812]状态FROM HSI.RMOBJECTINSTANCE1224 CT INNER JOIN HSI.RMOBJECTINSTANCE1232 S于CT.ATTR2846 = S.ATTR2821 INNER JOIN HSI.USERACCOUNT UA ON S.FK2852 =(UA.USERNUM * -1),其中CT.ACTIVESTATUS = 0>< / ASP:SqlDataSource的>
        < / TD>
        < TD风格=宽度:14%;>
            < ASP:DropDownList的ID =ddlDueDate的CssClass =选择选的DataSourceID =dsPopulateDueDate的AutoPostBack =真DataValueField =截止日期=服务器WIDTH =100%FONT-SIZE =11像素AppendDataBoundItems =真OnSelectedIndexChanged =ddlDueDate_onSelectIndexChanged>
                < ASP:ListItem的文本=所有VALUE =%>< / ASP:ListItem的>
            < / ASP:DropDownList的>
            < ASP:SqlDataSource的ID =dsPopulateDueDate=服务器的ConnectionString =<%$的ConnectionStrings:gvConnString%>中的SelectCommand =SELECT DISTINCT CONVERT(VARCHAR(14),[ATTR2752] 110)截止日期FROM HSI.RMOBJECTINSTANCE1224 CT INNER JOIN HSI.RMOBJECTINSTANCE1232 S于CT.ATTR2846 = S.ATTR2821 INNER JOIN HSI.USERACCOUNT UA ON S. FK2852 =(UA.USERNUM * -1),其中CT.ACTIVESTATUS = 0>< / ASP:SqlDataSource的>
        < / TD>
        < TD风格=宽度:15%;>
            < ASP:DropDownList的ID =ddlOwner的CssClass =选择选的DataSourceID =dsPopulateOwner的AutoPostBack =真DataValueField =所有者=服务器WIDTH =100%FONT-SIZE =11像素 AppendDataBoundItems =真OnSelectedIndexChanged =ddlOwner_onSelectIndexChanged>
                < ASP:ListItem的文本=所有VALUE =%>< / ASP:ListItem的>
            < / ASP:DropDownList的>
            < ASP:SqlDataSource的ID =dsPopulateOwner=服务器的ConnectionString =<%$的ConnectionStrings:gvConnString%>中的SelectCommand =SELECT DISTINCT [实名]'所有者'FROM HSI.RMOBJECTINSTANCE1224 CT INNER JOIN HSI.RMOBJECTINSTANCE1232 S于CT.ATTR2846 = S.ATTR2821 INNER JOIN HSI.USERACCOUNT UA ON S.FK2852 =(UA.USERNUM * -1),其中CT.ACTIVESTATUS = 0>< / ASP:SqlDataSource的>
        < / TD>
        < TD风格=宽度:15%;>
            < ASP:DropDownList的ID =ddlClient的CssClass =选择选的DataSourceID =dsPopulateClient的AutoPostBack =真DataValueField =客户=服务器WIDTH =100%FONT-SIZE =11像素 AppendDataBoundItems =真OnSelectedIndexChanged =ddlClient_onSelectIndexChanged>
                < ASP:ListItem的文本=所有VALUE =%>< / ASP:ListItem的>
            < / ASP:DropDownList的>
            < ASP:SqlDataSource的ID =dsPopulateClient=服务器的ConnectionString =<%$的ConnectionStrings:gvConnString%>中的SelectCommand =SELECT DISTINCT [ATTR2799]'客户'FROM HSI.RMOBJECTINSTANCE1224 CT INNER JOIN HSI.RMOBJECTINSTANCE1232 S于CT.ATTR2846 = S.ATTR2821 INNER JOIN HSI.USERACCOUNT UA ON S.FK2852 =(UA.USERNUM * -1),其中CT.ACTIVESTATUS = 0>< / ASP:SqlDataSource的>
        < / TD>
    < / TR>
< /表>
< ASP:GridView的ShowHeaderWhenEmpty =false的AlternatingRowStyle-背景色=#EBE9E9的AutoGenerateColumns =false的OnSorting =yourTasksGV_SortingAllowSorting =真正的ID =yourTasksGV=服务器的ClientIDMode =静态EmptyDataText = 没有数据可显示OnRowDataBound =yourTasksGV_RowDataBoundOnRowCreated =yourTasksGV_RowCreated>
    <柱体和GT;
        < ASP:HyperLinkField字段目标=_空白DataNavigateUrlFields =任务详细信息DataTextField =任务名称DataNavigateUrlFormatString =的HeaderText =任务详细信息SORTEX pression =任务名称ItemStyle-WIDTH =25% ItemStyle-的CssClass =taskTableColumn/>
        < ASP:BoundField的数据字段=服务的HeaderText =服务SORTEX pression =服务ItemStyle-WIDTH =20%ItemStyle-的CssClass =taskTableColumn/>
        < ASP:BoundField的数据字段=状态的HeaderText =状态SORTEX pression =状态ItemStyle-WIDTH =10%ItemStyle-的CssClass =taskTableColumn/>
        < ASP:BoundField的数据字段=截止日期的HeaderText =截止日期SORTEX pression =截止日期ItemStyle-WIDTH =15%ItemStyle-的CssClass =taskTableColumn/>
        < ASP:BoundField的数据字段=所有者的HeaderText =所有者SORTEX pression =所有者ItemStyle-WIDTH =15%ItemStyle-的CssClass =taskTableColumn/>
        < ASP:BoundField的数据字段=客户的HeaderText =客户SORTEX pression =客户ItemStyle-WIDTH =15%ItemStyle-的CssClass =taskTableColumn/>
    < /专栏>
< / ASP:GridView的>

下面是code,让我来填充和过滤表:

 公共无效PullData(字符串sortExp,串sortDir)
{
    查询字符串=;
    数据表taskData =新的DataTable();
    CONNSTRING = @; //我的连接字符串
    如果(ddlTask​​Name.SelectedIndex大于0)
    {
        strClause + =和CT.ATTR2739 ='+ ddlTask​​Name.SelectedItem.Text +';
    }
    其他
    {
        strClause + =和CT.ATTR2739 LIKE'%';
    }
    如果(ddlService.SelectedIndex大于0)
    {
        strClause + =和CT.ATTR2846 ='+ ddlService.SelectedItem.Text +';
    }
    其他
    {
        strClause + =和CT.ATTR2846 LIKE'%';
    }
    如果(ddlStatus.SelectedIndex大于0)
    {
        strClause + =和CT.ATTR2812 ='+ ddlStatus.SelectedItem.Text +';
    }
    其他
    {
        strClause + =和CT.ATTR2812 LIKE'%';
    }
    如果(ddlDueDate.SelectedIndex大于0)
    {
        strClause + =和CONVERT(VARCHAR(14),CT.ATTR2752,110)='+ ddlDueDate.SelectedItem.Text +';
    }
    其他
    {
        strClause + =和CONVERT(VARCHAR(14),CT.ATTR2752,110)LIKE'%';
    }
    如果(ddlOwner.SelectedIndex大于0)
    {
        strClause + =和UA.REALNAME ='+ ddlOwner.SelectedItem.Text +';
    }
    其他
    {
        strClause + =和UA.REALNAME LIKE'%';
    }
    如果(ddlClient.SelectedIndex大于0)
    {
        strClause + =和CT.ATTR2799 ='+ ddlClient.SelectedItem.Text +';
    }
    其他
    {
        strClause + =和CT.ATTR2799 LIKE'%';
    }    如果(ddlTask​​Name.SelectedIndex == 0安培;&安培; ddlService.SelectedIndex == 0安培;&安培; ddlStatus.SelectedIndex == 0安培;&安培; ddlDueDate.SelectedIndex == 0安培;&安培; ddlOwner.SelectedIndex == 0安培; &安培; ddlClient.SelectedIndex == 0)
    {
        查询= strMainQuery +WHERE CT.ACTIVESTATUS = 0;
    }
    其他
    {
        查询= strMainQuery +WHERE CT.ACTIVESTATUS = 0+ strClause;
    }    使用(SqlConnection的康恩=新的SqlConnection(CONNSTRING))
    {
        尝试
        {
            CMD的SqlCommand =新的SqlCommand(查询,康涅狄格州);            //创建数据适配器
            SqlDataAdapter的大=新SqlDataAdapter的(查询,康涅狄格州);
            //这将查询数据库并将结果返回到您的数据表            数据集myDataSet =新的DataSet();
            da.Fill(myDataSet);            数据视图名为myDataView =新的数据视图();
            名为myDataView = myDataSet.Tables [0] .DefaultView;            如果(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();
        }
        赶上(异常前)
        {
            字符串错误= ex.Message;
        }
    }
}
保护无效ddlTask​​Name_onSelectIndexChanged(对象发件人,EventArgs的发送)
{
    PullData(。的ViewState [sortExp]的ToString()的ViewState [中将sortOrder]的ToString());
}
保护无效ddlOwner_onSelectIndexChanged(对象发件人,EventArgs的发送)
{
    PullData(。的ViewState [sortExp]的ToString()的ViewState [中将sortOrder]的ToString());
}
保护无效ddlService_onSelectIndexChanged(对象发件人,EventArgs的发送)
{
    PullData(。的ViewState [sortExp]的ToString()的ViewState [中将sortOrder]的ToString());
}
保护无效ddlStatus_onSelectIndexChanged(对象发件人,EventArgs的发送)
{
    PullData(。的ViewState [sortExp]的ToString()的ViewState [中将sortOrder]的ToString());
}
保护无效ddlDueDate_onSelectIndexChanged(对象发件人,EventArgs的发送)
{
    PullData(。的ViewState [sortExp]的ToString()的ViewState [中将sortOrder]的ToString());
}
保护无效ddlClient_onSelectIndexChanged(对象发件人,EventArgs的发送)
{
    PullData(。的ViewState [sortExp]的ToString()的ViewState [中将sortOrder]的ToString());
}公共字符串中将sortOrder
{
    得到
    {
        如果(的ViewState [中将sortOrder]。的ToString()==说明)
        {
            的ViewState [中将sortOrder] =ASC;
        }
        其他
        {
            的ViewState [中将sortOrder] =说明;
        }        返回的ViewState [中将sortOrder]的ToString()。
    }
    组
    {
        的ViewState [中将sortOrder] =值;
    }
}

现在正在发生的事情是在加载页面时, GridView控件填充,也是的DropDownList 填充。当我过滤 GridView控件的DropDownList ,我怎么修改我的ASP.net页面或$ C $之一ç所以后面的其余的DropDownList 基础上改变了过滤 GridView控件

眼下的DropDownList 是硬$ C $的CD,但我想它是动态的,所以在的DropDownList 显示了数据更新的 GridView控件

更新:我更新了 PullData 函数如下:

 公共无效PullData(字符串sortExp,串sortDir)
        {
            查询字符串=;
            数据表taskData =新的DataTable();
            CONNSTRING = @; //连接字符串
            如果(ddlTask​​Name.SelectedIndex大于0)
            {
                strClause + =和CT.ATTR2739 ='+ ddlTask​​Name.SelectedItem.Text +';
            }
            其他
            {
                strClause + =和CT.ATTR2739 LIKE'%';
            }
            如果(ddlService.SelectedIndex大于0)
            {
                strClause + =和CT.ATTR2846 ='+ ddlService.SelectedItem.Text +';
            }
            其他
            {
                strClause + =和CT.ATTR2846 LIKE'%';
            }
            如果(ddlStatus.SelectedIndex大于0)
            {
                strClause + =和CT.ATTR2812 ='+ ddlStatus.SelectedItem.Text +';
            }
            其他
            {
                strClause + =和CT.ATTR2812 LIKE'%';
            }
            如果(ddlDueDate.SelectedIndex大于0)
            {
                strClause + =和CONVERT(VARCHAR(14),CT.ATTR2752,110)='+ ddlDueDate.SelectedItem.Text +';
            }
            其他
            {
                strClause + =和CONVERT(VARCHAR(14),CT.ATTR2752,110)LIKE'%';
            }
            如果(ddlOwner.SelectedIndex大于0)
            {
                strClause + =和UA.REALNAME ='+ ddlOwner.SelectedItem.Text +';
            }
            其他
            {
                strClause + =和UA.REALNAME LIKE'%';
            }
            如果(ddlClient.SelectedIndex大于0)
            {
                strClause + =和C.ATTR2815 ='+ ddlClient.SelectedItem.Text +';
            }
            其他
            {
                strClause + =和C.ATTR2815 LIKE'%';
            }
            如果(ddlSite.SelectedIndex大于0)
            {
                strClause + =和SI.ATTR2819 ='+ ddlSite.SelectedItem.Text +';
            }
            其他
            {
                strClause + =和SI.ATTR2819 LIKE'%';
            }
            如果(ddlPractice.SelectedIndex大于0)
            {
                strClause + =和PR.ATTR2817 ='+ ddlPractice.SelectedItem.Text +';
            }
            其他
            {
                strClause + =和PR.ATTR2817 LIKE'%';
            }
            如果(ddlProvider.SelectedIndex大于0)
            {
                strClause + =和P.ATTR2919 ='+ ddlProvider.SelectedItem.Text +';
            }
            其他
            {
                strClause + =和P.ATTR2919 LIKE'%';
            }
            如果(ddlTask​​Name.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)
            {
                查询= strMainQuery +WHERE CT.ACTIVESTATUS = 0;
            }
            其他
            {
                查询= strMainQuery +WHERE CT.ACTIVESTATUS = 0+ strClause;
            }            使用(SqlConnection的康恩=新的SqlConnection(CONNSTRING))
            {
                尝试
                {
                    CMD的SqlCommand =新的SqlCommand(查询,康涅狄格州);                    //创建数据适配器
                    SqlDataAdapter的大=新SqlDataAdapter的(查询,康涅狄格州);
                    //这将查询数据库并将结果返回到您的数据表                    数据集myDataSet =新的DataSet();
                    da.Fill(myDataSet);                    名为myDataView =新的数据视图();
                    名为myDataView = myDataSet.Tables [0] .DefaultView;                    如果(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(真的,任务名称);
                    VAR行数=(从DataRow的卓尔在dt.Rows选择新{名称=卓尔[任务名称],ID =卓尔[任务详细信息]​​})是不同的()。
                    ddlTask​​Name.DataSource =行;
                    ddlTask​​Name.DataTextField =任务名称;
                    ddlTask​​Name.DataValueField =任务详细信息;
                    ddlTask​​Name.DataBind();                    TasksUpdatePanel.Update();                    conn.Close();
                }
                赶上(异常前)
                {
                    字符串错误= ex.Message;
                }
            }
        }

据中得到这个错误:

  {System.InvalidOperationException:两个DataSource和DataSourceID的是在ddlTask​​Name定义。删除一个定义。
   在System.Web.UI.WebControls.DataBoundControl.EnsureSingleDataSource()
   在System.Web.UI.WebControls.DataBoundControl.ConnectToDataSourceView()
   在System.Web.UI.WebControls.DataBoundControl.GetData()
   在System.Web.UI.WebControls.ListControl.OnDataBinding(EventArgs的发送)
   在System.Web.UI.WebControls.ListControl.PerformSelect()
   在System.Web.UI.WebControls.BaseDataBoundControl.DataBind()
   在OB.Pages.YT.PullData(字符串sortExp,字符串sortDir)在Tasks.aspx.cs:行210}


解决方案

从你的问题我的理解是要与gridview.if各列每个下拉关联我是正确的,你可以做到这一点。

  ddlTask​​Name.DataSource =名为myDataView;
    ddlTask​​Name.DataTextField =姓名; //列的名称要显示为文本
    ddlTask​​Name.DataValueField =ID; //你想成为下拉列表项的值列的名称。
    ddlTask​​Name.DataBind();

您必须对您的PullData方法每一个下拉做到这一点。

更新1

下面是两种方法,如果你DataValueFiled和DataTextFeild相同比你可以试试这个,你可以尝试

  DataTable的DT = myDataView.ToTable(真,姓名);
    ddlTask​​Name.DataSource = DT;
    ddlTask​​Name.DataTextField =姓名;
    ddlTask​​Name.DataValueField =姓名;
    ddlTask​​Name.DataBind();

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

  VAR行数=(从DataRow的卓尔在dt.Rows选择新{名称=卓尔[名称],ID =卓尔[ID]})是不同的()。
 ddlTask​​Name.DataSource =行;
    ddlTask​​Name.DataTextField =姓名;
    ddlTask​​Name.DataValueField =ID;
    ddlTask​​Name.DataBind();

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

确定在这里你去

现在您的第一个下拉看起来像这样

 < ASP:DropDownList的ID =ddlTask​​Name的CssClass =选择选的AutoPostBack =真=服务器WIDTH =100%FONT-SIZE = 11像素AppendDataBoundItems =真OnSelectedIndexChanged =ddlTask​​Name_onSelectIndexChanged>< / ASP:DropDownList的>

现在在页面加载时,你会用数据填充这就是你想要什么都像这样

  ddlTask​​Name.DataSource =数据集OT的数据表或数据视图名;
    ddlTask​​Name.DataTextField =姓名;
    ddlTask​​Name.DataValueField =ID;
    ddlTask​​Name.DataBind();

和上拉数据的方法,你会做这样的

  VAR行数=(从DataRow的卓尔在dt.Rows选择新{名称=卓尔[名称],ID =卓尔[ID]})是不同的()。
    ddlTask​​Name.DataSource =行;
    ddlTask​​Name.DataTextField =姓名;
    ddlTask​​Name.DataValueField =ID;
    ddlTask​​Name.DataBind();

这里的DT是DataTable对象,如果你都尽显你可以使用这样的myDataSet.Tables [0],而不是DT的数据集。

和添加一个选项所有,你可以像这样

  ddlTest.Items.Insert(0,新的ListItem(全部));

这将插入所有的顶部,你可以改变它的位置。

I have the following code which is a GridView and right above it I have DropDownList which allows me to filter:

<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>

Here is the code which allows me to populate and filter the table:

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;
    }
}

Now what is happening is when the page is loaded, the GridView is populated and also the DropDownList is populated. When I filter the GridView from one of the DropDownList, how do I modify my ASP.net page or code behind so the rest of the DropDownList is changed based on the filtered GridView?

Right now the DropDownList is hard coded, but I would like it to be dynamic so the DropDownList shows the data from the updated GridView.

UPDATE: I updated the PullData function to this:

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;
                }
            }
        }

It is failing with this error:

{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}

解决方案

From your question what i understand is you want to associate every dropdown with respective columns of gridview.if i am right you can do this

    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();

You will have to do this for every dropdown in your PullData method.

Update 1

Here are two methods you can try if your DataValueFiled and DataTextFeild are same than you can try this

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

This will only select one column and that is Name column. If you have different DataValueField and DataTextFeild than you can try this

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();

===========================Update 2===============

Ok Here you go

Now your first drop down will look like this

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

Now on page load you will fill this with data what ever you want like this

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

And in Pull data method you will do like this

 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();

The dt here is DataTable object if you are filling a dataset you can use like this myDataSet.Tables[0] instead of dt.

And to add an option "All" you can do like this

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

This will insert "All" at the top you can change its location.

这篇关于如何更新基于该过滤GridView中的DropDownList的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆