0

リストボックスにアイテムを追加する作業をしていますuxSearchList。ただし、背後のコードは期待どおりに機能しuxSearchListますが、をクリックした後の変更はリストボックス内に反映されませんSearch

私は次のことをします:

  • 検索条件を入力してください(uxEsnCheck/TextuxLocationList/Text
  • クリックSearch
  • (進行中)検索結果をに入力しますuxSearchList

uxSearchList現在持っているものからリストボックスにデータを入力するにはどうすればよいですか?私のコードは以下の通りです。


.ASPX.CS

    protected void uxSearchParams_Click(object sender, EventArgs e)
    {
        uxSearchList.Items.Clear();

        var selectedSerial = uxEsnText.Text;
        var selectedLocation = uxLocationList.Text;

        if (!uxEsnText.Enabled)
        {
            selectedSerial = string.Empty;
        }
        if (!uxLocationList.Enabled)
        {
            selectedLocation = string.Empty;
        }

        if (Page.IsValid)
        {
            var selectedParams = _presenter.OnSelectionParams(selectedSerial, selectedLocation);

            foreach (var param in selectedParams)
            {
                uxSearchList.Items.Add(param.SerialNumber);
            }
        }
    }

.ASPX

        <asp:UpdatePanel ID="uxParamsPanel" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:CheckBox ID="uxEsnCheck" runat="server" CssClass="form-label" Text="Engine Serial Number" OnCheckedChanged="uxEsnCheck_CheckedChanged" AutoPostBack="true" />
                <asp:TextBox ID="uxEsnText" runat="server" Enabled="False"/>

                <asp:CheckBox ID="uxLocationCheck" runat="server" CssClass="form-label" Text="Location" OnCheckedChanged="uxLocationCheck_CheckedChanged" AutoPostBack="true" />
                <asp:DropDownList ID="uxLocationList" runat="server" Enabled="False"/>

                <asp:Button ID="uxSearchParams" runat="server" onclick="uxSearchParams_Click" CssClass="form-label" Text="Search" />
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="uxSearchParams" EventName="Click" />

                <asp:AsyncPostBackTrigger ControlID="uxEsnCheck" EventName="CheckedChanged" />
                <asp:AsyncPostBackTrigger ControlID="uxLocationCheck" EventName="CheckedChanged" />
            </Triggers>
        </asp:UpdatePanel>

        <asp:UpdatePanel ID="uxSelectionPanel" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:Label ID="uxSearchDisplay" runat="server" CssClass="form-label" Text="Search Results" />
                <asp:ListBox ID="uxSearchList" runat="server" Width="250px" />

                <asp:Label ID="uxMemberDisplay" runat="server" CssClass="form-label" Text="Engine Group Members" />
                <asp:ListBox ID="uxMemberList" runat="server" Width="250px" />

                <asp:Button ID="uxAdd" runat="server" onclick="uxAdd_Click" Text=">" />
                <asp:Button ID="uxRemove" runat="server" onclick="uxRemove_Click" Text="<" />
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="uxAdd" EventName="Click" />
                <asp:AsyncPostBackTrigger ControlID="uxRemove" EventName="Click" />
            </Triggers>
        </asp:UpdatePanel>
4

2 に答える 2

0

データバインディングメソッドを使用すると、より良い結果が得られる可能性があります。次のクラスを使用して、結果を正しく表示することができました。

using System;
using System.Collections.Generic;

namespace Test.Web
{
    public partial class Test : System.Web.UI.Page
    {
        private readonly IList<string> database;
        private string currentSearch;

        public Test()
        {
            database = new List<string>();
            database.Add("hello");
            database.Add("world");
        }

        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            uxSearchList.DataBinding += dataBindSearch;
        }

        protected void OnSearch(object sender, EventArgs e)
        {
            currentSearch = searchText.Text;
            uxSearchList.DataBind();
        }

        private void dataBindSearch(object sender, EventArgs e)
        {
            IList<string> results = new List<string>();
            foreach (string item in database)
            {
                if (item.StartsWith(currentSearch))
                {
                    results.Add(item);
                }
            }
            uxSearchList.DataSource = results;
        }
    }
}

主な違いはDataSource、コレクションの代わりに使用Itemsしており、検索クエリが変更されたときにリストでDataBindを呼び出すことです。

この変更がうまくいかない場合は、マークアップに別の問題がある可能性があります。OnTextChangedイベントをバインドしているだけですが、それ以上は何もありません。

<div>
    <asp:TextBox ID="searchText" OnTextChanged="OnSearch" AutoPostBack="true" runat="server" />
    <asp:UpdatePanel ID="uxSelectionPanel" runat="server">
        <ContentTemplate>
            <asp:Label ID="uxSearchDisplay" runat="server" CssClass="form-label" Text="Search Results" />
            <asp:ListBox ID="uxSearchList" runat="server" Width="250px" />
        </ContentTemplate>
    </asp:UpdatePanel>
</div>
于 2013-01-17T00:12:09.990 に答える
0

検索をクリックすると、サーバー側のリストが更新されます。クライアント側が更新する方法を提供する必要があります。uxSearchList が UpdatePanel 内にあることがわかります。私はこれらがあまり得意ではありませんが、これにトリガーを追加しようとします. このように、uxSearchList の内容が変更されると、クライアント側の表示も更新されます。

于 2013-01-16T23:24:01.413 に答える