1

この問題に関する質問がここに投稿されたのはこれが初めてではないことは承知していますが、私の質問に対する回答を見つけることができませんでした。

ページにいくつかの ListBoxes があります。

<tr>
    <td class="loqhArea2Area">
        <asp:ListBox ID="ListBox1Val1" class="InputItem" runat="server" AutoPostBack="true"></asp:ListBox>
    </td>
    <td class="loqhArea3Area">
        <asp:ListBox ID="ListBox2Val1" class="InputItem" runat="server" AutoPostBack="true"></asp:ListBox>
    </td>
    <td class="loqhArea4Area">
        <asp:ListBox ID="ListBox3Val1" class="InputItem" runat="server"></asp:ListBox>
    </td>
</tr>

これらのボックスはある意味で相互にリンクされており、最初のボックスの選択が 2 番目のボックスに入力され、4 番目のボックスに入力されます。それらから情報を取得するために、次のコード スニペットを使用します。

protected override void OnInit(EventArgs e)
{
// Do some other stuff ...

    if (!IsPostBack)
    {
        // Fill the boxes on initial load
    }
    else
    {
        // INeedTheData takes an ID-string (in this case "Val1")
        // and the selected indexes as ints
        INeedTheData("Val1",
                      ListBox1Val1.SelectedIndex,
                      ListBox2Val1.SelectedIndex,
                      ListBox3Val1.SelectedIndex);

    }
    // Some error handling    
}

問題は、SelectedIndexes がすべて を返す-1ことです。これは明らかに私が必要としているものではありません。

私はこの問題の解決策を求めて狂ったようにグーグルで検索してきました。すべての手がかりやリードは大歓迎です。前もって感謝します!

更新: おそらくこれは誰にとっても手がかりになる可能性があります.私の前任者(残念ながら連絡が取れていません)は、実際に機能するこのかなり奇妙なコードを実装しました. というか作品っぽい。問題は、ある種のより信頼性の高いコードが必要だったので、書き直すことにしました。

INeedTheData("Val1"
    , Request.Form.AllKeys.Contains("ctl01$ListBox1Val1") ? Request.Form["ctl01$ListBox1Val1"] == string.Empty ? 0 : int.Parse(Request.Form["ctl01$ListBox1Val1"]) : 0
    , Request.Form.AllKeys.Contains("ctl01$ListBox2Val1") ? Request.Form["ctl01$ListBox2Val1"] == string.Empty ? 0 : int.Parse(Request.Form["ctl01$ListBox2Val1"]) : 0
    , Request.Form.AllKeys.Contains("ctl01$ListBox3Val1") ? Request.Form["ctl01$ListBox3Val1"] == string.Empty ? 0 : int.Parse(Request.Form["ctl01$ListBox3Val1"]) : 0);

このソリューションは、ハードコードされた html ID を使用してデータを取得するため、望ましくありません。これは、将来ページ上の要素を再構築および再編成するときに変更される可能性があります。とにかく、書き直す理由があるので、ここに入力する必要があると思いました。

前述のとおり、すべてのコメントを歓迎します。ありがとう!

更新 ii (@Deeptechtons への回答): 望ましい動作 ツリー グラフから移動して選択するために使用される 3 つの ListBoxes のグループがあります。最初のボックス ( ListBox1Val1) は、データベースから直接入力されます。2 番目 ( ListBox2Val1) は、ユーザーが最初の選択肢を選択するまで空です。そうすることで、最初のリストボックスで選択されたノードの子が 2 番目のリストボックスにロードされます。リストボックス番号 3 ( ) についても同じことが言えListBox3Val1ます。2 番目のボックスでノードを選択すると、3 番目のボックスにデータが入力されます。

4

2 に答える 2

2

@dotmartin Csファイルに必要なコードは次のとおりです

 protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ListBox1.DataSource = GetList();
            ListBox1.DataBind();
        }
    }

    protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        ListBox2.DataSource = GetSecondList(ListBox1.SelectedIndex);
        ListBox2.DataBind();
    }

    protected void ListBox2_SelectedIndexChanged(object sender, EventArgs e)
    {
        ListBox3.Items.Add(new ListItem(ListBox1.SelectedValue + "-" + ListBox2.SelectedValue, "Wippie"));
    }

    private ListItemCollection GetList()
    {
        ListItemCollection lstNumbers = new ListItemCollection();
        lstNumbers.Add(new ListItem("1", "One"));
        lstNumbers.Add(new ListItem("2", "Two"));
        lstNumbers.Add(new ListItem("3", "Three"));
        lstNumbers.Add(new ListItem("4", "Four"));
        lstNumbers.Add(new ListItem("5", "Five"));
        return lstNumbers;
    }

    private ListItemCollection GetSecondList(int iSelectedIndex)
    {
        ListItemCollection lstRandom = new ListItemCollection();
        System.Random RandNum = new System.Random();
        for (int i = 0; i < 10; i++)
        {
            lstRandom.Add(new ListItem(RandNum.Next(ListBox1.SelectedIndex, i + 1).ToString(), "random"));
        }
        return lstRandom;
    }

リストボックスにバインドする乱数を生成しました。

以下はaspxファイルのコードです。

<form id="form1" runat="server">
        <asp:ScriptManager id="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <div>
            <asp:UpdatePanel id="UpdatePanel1" runat="server" updatemode="Conditional" childrenastriggers="true">
                <ContentTemplate>
                    <div>
                        <asp:ListBox id="ListBox1" autopostback="true" runat="server" onselectedindexchanged="ListBox1_SelectedIndexChanged"
                            width="200"></asp:ListBox></div>
                    <div>
                        <asp:ListBox id="ListBox2" autopostback="true" runat="server" onselectedindexchanged="ListBox2_SelectedIndexChanged"
                            width="200"></asp:ListBox></div>
                    <div>
                        <asp:ListBox id="ListBox3" autopostback="true" runat="server" width="200"></asp:ListBox>
                    </div>
                </ContentTemplate>
            </asp:UpdatePanel>
        </div>
    </form>
于 2011-04-07T12:07:56.923 に答える
0

実際には、ASP.NET では、ページ ライフサイクルのページ読み込み後に制御イベントが発生します: ASP.NET ページ ライフ サイクルの概要

私は(正確な名前についてはわかりませんが)ドロップダウンにはSelectedIndexChanged、新しい選択を行うことを考える必要があるイベントが必要だと思います。

これが役立つことを願っています!

于 2011-04-07T09:45:19.840 に答える