0

サーバー側に移動し、他のドロップダウンリストに値を入力するボタンクリックイベントを使用しているという点で、jQuery multiselect を使用しています。ドロップダウン リストでチェックされた選択に基づいて、他のドロップダウン リストに値が入力されます。

問題:

たとえば、最初の jQuery 複数選択ドロップダウンで 3 つの値を選択し、これら 3 つの値に基づいてドロップダウンリストを閉じると、詳細は他の jQuery 複数選択ドロップダウンリストにフェッチされますが、最後にチェックされた値のみがチェックされ、保持されます。ボタンクリックイベントが原因で非同期ポストバックが発生し、値が保持されていないと思います。ボタンクリックイベントでそのポストバックを防ぐオプションはありますが、クリックを呼び出す必要がある場合は、値のみが保持されます。

これらについて、スクリーンショットを添付しています:

ここに画像の説明を入力

その3つの値に基づいて、他のドロップダウンリストにロードされますが、デフォルトの「選択」である「1が選択されました」と表示されます。

ここに画像の説明を入力

しかし、最初のドロップダウンリストでチェックされた値を取得できる2番目のドロップダウンリスト:

ここに画像の説明を入力

これは私のJavaScriptです:

  $(document).ready(function () {

            $('.department').multiselect({
                show: ["bounce", 5], hide: ["blind", 1],

                close: function () {
                    debugger;
                    var values = new Array();

                    $(this).multiselect("getChecked").each(function (index, item) {
                        values.push($(item).val());
                    });
                    $("input[id*=selectedValues]").val(values.join(","));
                    document.getElementById("<%=hdnDepartment.ClientID %>").value = values;
                    if (document.getElementById("<%=hdnDepartment.ClientID %>").value != "") {
                        **$("#<%=Button1.ClientID %>")[0].click();**

                    }
                }

            })
        .multiselectfilter();
        });

protected void Button1_Click(object sender, EventArgs e)
    {
        Populate();
    }

間違っていたら訂正...

4

2 に答える 2

1

OnClientClick を使用して、要件に応じて false または true を返すことができます。OnClientClick が true を返す場合、ポストバックが発生します。それ以外の場合、ポストバックは発生しません

于 2012-09-24T07:56:39.337 に答える
0
 <script type="text/javascript">
      function pageLoad() {
           $("#<%= DepartmentsListBox.ClientID %>").multiselect({
                create: function () {
                     $(this).data("initValues", $.map($("option:selected", this), function (option) { return option.value; }).join(","));
                },
                close: function () {
                     var selectedValues = $.map($("option:selected", this), function (option) { return option.value; }).join(",");
                     if (selectedValues !== $(this).data("initValues")) {
                          __doPostBack("<%= DepartmentsListBox.UniqueID %>", "");
                     }
                }
           });

           $("#<%= EmployeesListBox.ClientID %>").multiselect();
      }
 </script>


 <asp:UpdatePanel runat="server" UpdateMode="Always">
      <ContentTemplate>
           <asp:ListBox runat="server" ID="DepartmentsListBox" DataValueField="DepartmentId"
                SelectionMode="Multiple" DataTextField="Name" Width="300px"></asp:ListBox>
           <br />
           <asp:ListBox runat="server" ID="EmployeesListBox" Width="300px" SelectionMode="Multiple" AppendDataBoundItems="true"
                DataValueField="EmployeeId" DataTextField="Name"></asp:ListBox>
           <br />
           <asp:Button runat="server" ID="SubmitButton" Text="Submit" />
      </ContentTemplate>
 </asp:UpdatePanel>

サーバーコード

private static Random rnd = new Random();

private string[] selectedDepartments;
private string[] SelectedDepartments
{
    get
    {
        return selectedDepartments ?? (selectedDepartments = DepartmentsListBox.Items.OfType<ListItem>().Where(item => item.Selected).Select(item => item.Value).ToArray());
    }
}

protected void Page_Init(object sender, EventArgs e)
{
    EmployeesListBox.PreRender += new EventHandler(EmployeesListBox_PreRender);
    DepartmentsListBox.SelectedIndexChanged += new EventHandler(DepartmentsListBox_SelectedIndexChanged);
}

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindDepartments();
    }
}

void EmployeesListBox_PreRender(object sender, EventArgs e)
{
    if (EmployeesListBox.Items.Count > 0)
    {
        EmployeesListBox.Attributes.Remove("disabled");
    }
    else
    {
        EmployeesListBox.Attributes["disabled"] = "disabled";
    }
}

private void BindDepartments()
{
    var departments = Enumerable.Range(1, 10)
        .Select(id => new { DepartmentId = id, Name = "Department " + id.ToString() });
    DepartmentsListBox.DataSource = departments;
    DepartmentsListBox.DataBind();
}

void DepartmentsListBox_SelectedIndexChanged(object sender, EventArgs e)
{
    var employees = Enumerable.Range(1, 10)
        .Select(id => new { EmployeeId = id, DepartmentId = rnd.Next(1, 10), Name = "Employee #" + id.ToString() })
        .Where(emp => SelectedDepartments.Contains(emp.DepartmentId.ToString())).ToList();

    for (int itemIndex = EmployeesListBox.Items.Count - 1; itemIndex >= 0; itemIndex--)
    {
        var employee = employees.FirstOrDefault(emp => emp.EmployeeId.ToString() == EmployeesListBox.Items[itemIndex].Value);
        if (employee == null)
        {
            EmployeesListBox.Items.RemoveAt(itemIndex);
        }
        else
        {
            employees.Remove(employee);
        }
    }

    EmployeesListBox.DataSource = employees;
    EmployeesListBox.DataBind();
}
于 2012-09-24T10:43:28.243 に答える