简体   繁体   English

在Jquery UI Multiselect小部件中回发后,所选项目仍保持选中状态

[英]Selected items remains selected after postback in Jquery UI Multiselect widget

I am trying to create an GridView in asp.net which can filter each column of gridview as Excel can. 我试图在asp.net中创建一个GridView,它可以像Excel一样过滤gridview的每一列。 For this I had created an Gridview and used Jquery multiselect widget on the header of each column of GridView to do the filter. 为此,我创建了一个Gridview并在GridView的每一列的标题上使用了Jquery multiselect小部件来进行过滤。

<cc1:GridView ID="gvDailyTracker" runat="server" CssClass="mGrid" CellSpacing="2" AutoGenerateColumns="false"
              ShowFooter="false" AllowPaging="true" OnPageIndexChanging="gvDailyTracker_PageIndexChanging" OnRowDataBound="gvDailyTracker_RowDataBound"
              OnRowCommand="gvDailyTracker_RowCommand" OnRowEditing="gvDailyTracker_RowEditing" OnSelectedIndexChanged="gvDailyTracker_SelectedIndexChanged"
              OnDataBound="gvDailyTracker_DataBound">
    <EmptyDataRowStyle BackColor="LightBlue" Width="1180" />
    <EmptyDataTemplate>
        No Data Found From The Current Selection,Please Select  Appropriate Search Criteria.  
    </EmptyDataTemplate>
    <Columns>
        <asp:TemplateField SortExpression="DateProcessed" HeaderStyle-Font-Bold="true"
            HeaderStyle-Font-Names="Calibre" HeaderStyle-ForeColor="White">
            <HeaderTemplate>
                <select id="ddlDateProcessed" name="test" runat="server" multiple="true" style="width: 100px;">
                </select>
            </HeaderTemplate>
            <ItemTemplate>
                <asp:Label ID="lblDateProcessed" runat="server" Text='<%#Eval("DateProcessed") %>' CssClass="GridContent" />
            </ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField SortExpression="InvoiceFileName" HeaderStyle-Font-Bold="true"
            HeaderStyle-Font-Names="Calibre" HeaderStyle-ForeColor="White">
            <HeaderTemplate>
                <select id="ddlInvoiceFilename" name="test" runat="server" multiple="true" style="width: 100px;">
                </select>
            </HeaderTemplate>
            <ItemTemplate>
                <asp:Label ID="lblInvoiceFileName" runat="server" Text='<%#Eval("InvoiceFileName") %>' CssClass="GridContent" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</cc1:GridView>
<script type="text/javascript">        
    $(document).ready(function () {
        $("#MainContent_gvDailyTracker_ddlDateProcessed").multiselect({
            SelectedText: 'DateProcessed',
            noneSelectedText: 'DateProcessed',
            close: function () {
                var dateProcessed = $("#MainContent_gvDailyTracker_ddlDateProcessed").multiselect("getChecked").map(function () {
                    return this.value;
                }).get();
                document.getElementById('<%=txtddlDateProcessed.ClientID%>').value = dateProcessed;
                document.getElementById('<%=btnPostBack.ClientID %>').click();
            },
            beforeopen: function () {
                $("#MainContent_gvDailyTracker_ddlDateProcessed").multiselect("checkAll");
            },
            minWidth: 120
        });


        $("#MainContent_gvDailyTracker_ddlInvoiceFilename").multiselect({
            SelectedText: 'InvoiceFileName',
            noneSelectedText: 'InvoiceFileName',
            close: function () {
                var InvoiceFilename = $("#MainContent_gvDailyTracker_ddlInvoiceFilename").multiselect("getChecked").map(function () {
                    return this.value;
                }).get();
                document.getElementById('<%=txtddlInvoiceFileName.ClientID%>').value = InvoiceFilename;
                document.getElementById('<%=btnPostBack.ClientID %>').click();
            },
            beforeopen: function () {
                $("#MainContent_gvDailyTracker_ddlInvoiceFilename").multiselect("checkAll");
            },
            minWidth: 120
        });
    });
    function test() {
                BindAllMultiSelectData();
                var dateProcessed = $("#MainContent_gvDailyTracker_ddlDateProcessed").multiselect("getChecked").map(function () {
                    return this.value;
                }).get();
                var InvoiceFilename = $("#MainContent_gvDailyTracker_ddlInvoiceFilename").multiselect("getChecked").map(function () {
                    return this.value;
                }).get();
                document.getElementById('<%=txtddlDateProcessed.ClientID%>').value = dateProcessed;
                document.getElementById('<%=txtddlInvoiceFileName.ClientID%>').value = InvoiceFilename;
                }
    function BindAllMultiSelectData() {
        $("#MainContent_gvDailyTracker_ddlDateProcessed").multiselect({
            SelectedText: 'DateProcessed',
            noneSelectedText: 'DateProcessed',
            close: function () {
                var dateProcessed = $("#MainContent_gvDailyTracker_ddlDateProcessed").multiselect("getChecked").map(function () {
                    return this.value;
                }).get();
                document.getElementById('<%=txtddlDateProcessed.ClientID%>').value = dateProcessed;
                document.getElementById('<%=btnPostBack.ClientID %>').click();
            },
           minWidth: 120
       });


        $("#MainContent_gvDailyTracker_ddlInvoiceFilename").multiselect({
            SelectedText: 'InvoiceFileName',
            noneSelectedText: 'InvoiceFileName',
            close: function () {
                var InvoiceFilename = $("#MainContent_gvDailyTracker_ddlInvoiceFilename").multiselect("getChecked").map(function () {
                    return this.value;
                }).get();
                document.getElementById('<%=txtddlInvoiceFileName.ClientID%>').value = InvoiceFilename;
                document.getElementById('<%=btnPostBack.ClientID %>').click();
            },
            minWidth: 120
        });
</script>

C# Code for Filtering the gridView 用于过滤gridView的C#代码

protected void btnPostBack_Click(object sender, EventArgs e)
{
    if (!txtddlDateProcessed.Text.Equals(null) && txtddlDateProcessed.Text != string.Empty)
    {
    string filter=txtddlDateProcessed.Text;
    filter = filter.Replace(",", "','");
    string strFilter="[DateProcessed]" + " in ('" + filter + "')";
    FilterHeader(strFilter);
    }

    if (!txtddlInvoiceFileName.Text.Equals(null) && txtddlInvoiceFileName.Text != string.Empty)
    {
    string filter=txtddlInvoiceFileName.Text;
    filter = filter.Replace(",", "','");
    string strFilter="[InvoiceFileName]" + " in ('" + filter + "')";
    FilterHeader(strFilter);
    }
     ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(), "test();", true);
}

Up to here every thing is working fine and I am able to filter the grid view. 到目前为止,一切正常,我能够过滤网格视图。 Now what i actually want is that after filtration of grid view, The Selection made on Multi Select widgets remains still. 现在,我真正想要的是在过滤网格视图之后,在“多选”小部件上进行的选择仍然保持不变。 Currently after filtration all multiselect get unchecked. 目前,过滤后,所有多选项目均未选中。

Note:-1. 注:-1。 I am binding Multiselect dynamically .(Distinct records of that column values binding to the multiselect) 我正在动态绑定多重选择。(该列值的不同记录绑定到多重选择)

private void BindHeaderDropDown(string columnName, DataTable dt, string controlName)
{
    System.Web.UI.HtmlControls.HtmlSelect objControlName = (System.Web.UI.HtmlControls.HtmlSelect)gvDailyTracker.HeaderRow.FindControl(controlName);
    DataView view=new DataView(dt);
    DataTable distinctValues = view.ToTable(true, columnName);
    objControlName.DataSource = distinctValues;
    objControlName.DataTextField = columnName;
    objControlName.DataValueField = columnName;
    objControlName.DataBind();
}

On Page load after binding the grid, I am binding the Multiselect widgets by calling BindHeaderDropDown Function And after filtering the grid view with the selected values, again i am calling the same function ie BindHeaderDropDown for binding Multiselect.In case if I am not calling this function after filteration,nothing get binded to the Multiselect and it is blank without a single checkbox items. 在绑定网格后的页面加载中,我通过调用BindHeaderDropDown函数来绑定BindHeaderDropDown窗口小部件,并在使用选定值过BindHeaderDropDown格视图之后,再次调用相同的函数,即BindHeaderDropDown来绑定BindHeaderDropDown 。过滤后的功能,没有任何东西绑定到Multiselect,并且它是空白的,没有单个复选框项目。

Please help me and guide me, what i will do ? 请帮助我并指导我,我该怎么办? Thanks In Advance. 提前致谢。

As you are rebinding your Multiselect controls, in each post back (page load method), that is why the user selected values are lost, because you are re-generating your filter controls. 重新绑定Multiselect控件时,在每个回发(页面加载方法)中,这就是丢失用户选择的值的原因,因为您正在重新生成过滤器控件。

To persist the user selection, you can update your Re-binding method and add Logic to check if it is Initial load or a post back. 要保留用户的选择,可以更新重新绑定方法并添加Logic来检查它是“初始加载”还是“回发”。 If it is a post-back then after rebinding your controls, add/set the values manually in the respective filter controls. 如果是回发,则在重新绑定控件后,在相应的过滤器控件中手动添加/设置值。

Hopefully it may solve your issue. 希望它可以解决您的问题。 Thanks 谢谢

private void BindHeaderDropDown(string columnName, DataTable dt, string controlName)
{
  System.Web.UI.HtmlControls.HtmlSelect objControlName = (System.Web.UI.HtmlControls.HtmlSelect)gvDailyTracker.HeaderRow.FindControl(controlName);
  DataView view=new DataView(dt);
  DataTable distinctValues = view.ToTable(true, columnName);
  objControlName.DataSource = distinctValues;
  objControlName.DataTextField = columnName;
  objControlName.DataValueField = columnName;
  objControlName.DataBind();
  // check if it is post-back
  objControlName.Text = Latest User value;
}

Better u can save your multiselected value in hidden field.And again according to hidden field value u can populate those items in multiselect dropdown. 更好的是,您可以将您的多选值保存在隐藏字段中,然后根据隐藏字段值再次在多选下拉列表中填充这些项目。

This method for storing the value in the hidden field 这种将值存储在隐藏字段中的方法

close: function (event, ui) {

                var values = new Array();
                $("#ddlAssignedTo").multiselect("getChecked").each(function (index, item) {
                    values.push($(item).val());
                });
                $("input[id*=hdnAssignTo]").val(values.join(","));
            }

this the method for populating the value in multislect dropdown according to hiddenfield 这是根据hiddenfield在multislect下拉列表中填充值的方法

  function loadSelectedUsers() {
        $("#ddlAssignedTo").multiselect("uncheckAll");

        var listAssigned = $("#ctl00_MainContent_ddlAssignedTo option:selected").length;

        if (listAssigned == 0) {

            if ($("#<%=hdnAssignTo.ClientID%>").val() != null && $("#<%=hdnAssignTo.ClientID%>").val() != undefined && $("#<%=hdnAssignTo.ClientID%>").val() != "") {
                var arrUserIdSelected = $("#<%=hdnAssignTo.ClientID%>").val().split(',');


                if (arrUserIdSelected != null && arrUserIdSelected.length > 0) {
                    for (var iCount = 0; iCount < arrUserIdSelected.length; iCount++) {
                        $("#ddlAssignedTo").multiselect("widget").find("input:checkbox[value='" + arrUserIdSelected[iCount] + "']").attr("checked", "checked");
                        $("#ddlAssignedTo option[value='" + arrUserIdSelected[iCount] + "']").attr("selected", 1);
                        $("#ddlAssignedTo").multiselect("refresh");
                    }
                }
            }
        } 
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM