2

以前は自分の C# プログラミングはそれほど悪くないと思っていましたが、今日、自分の頭に真剣に疑問を投げかけています。

DropDownList を動作させようとしていますが、今日はうまくいきません。ascx ページに動的に読み込まれる ascx コントロールに単純な DropDownList があります。

<asp:DropDownList ID="ddl_SortBy" runat="server" AutoPostBack="true">             
  <asp:ListItem Value="0">Sort Alphabetically A to Z</asp:ListItem>
  <asp:ListItem Value="1">Sort Alphabetically Z to A</asp:ListItem>
</asp:DropDownList>

そしていくつかのコードビハインド..

    private short SortBy = 0;

    protected void Page_Load(object sender, EventArgs e)
    {
        this.ddl_SortBy.SelectedIndex = -1;
        this.ddl_SortBy.SelectedIndexChanged += new EventHandler(ddl_SortBy_SelectedIndexChanged);

        if (!IsPostBack)
            SearchDirectory();
    }

    public void ddl_SortBy_SelectedIndexChanged(object sender, EventArgs e)
    {
        SortBy = Convert.ToInt16(this.ddl_SortBy.SelectedItem.Value);
        SearchDirectory();
    }

SearchDirectory() 関数が呼び出されないため、選択したインデックス変更イベントをトリガーする最初のアイテムを取得できません。コントロールが最初のアイテムをロードするときに IS が選択されている可能性があるため、選択時にインデックスが実際には変更されていない可能性があることを理解できます。

選択した項目のインデックスを -1 に設定し、ページの読み込み時に ClearSelection() を設定しようとしましたが、うまくいきませんでした。

何か案は?ありがとう

4

5 に答える 5

6

SelectedIndexすべてのポストバックで常に-1にリセットしています。

this.ddl_SortBy.SelectedIndex = -1;

それで、それをポストバックチェックにも入れてください:

if (!IsPostBack)
{
    this.ddl_SortBy.SelectedIndex = -1;
    SearchDirectory();
}
于 2012-07-10T12:22:13.573 に答える
1

あなたが期待しているように、Page_Loadで変更イベントを実行する必要があるのと同じように自分自身を見つけました..問題は、.SelectecIndexを0に設定したいくつかのListItemsを配置する前に、ASP.NETでそれを認識したことです.

したがって、this.ddl_SortBy.SelectedIndex = -1 のようなものを配置すると、その後もデバッガーは 0 を表示するため、-1 をオンにすることはなく、変更イベントを実行することもありません。何も選択されていない場合 (-1)、ASP.NET が常に最初の ListItem を選択されたものと見なすように、強制的に -1 または 0 を実行すると、最初に変更イベントが呼び出されることはありません。

もう少し検索すると、「デフォルト値は 0 で、リストの最初の項目が選択されます。」

http://msdn.microsoft.com/en-us/library/vstudio/system.web.ui.webcontrols.dropdownlist.selectedindex(v=vs.100).aspxから、次のようなイベントへの呼び出しを強制する必要があると思います: ddl_SortBy_SelectedIndexChanged(null, null);

于 2012-11-21T23:53:13.070 に答える
0

マスター ページの表示状態がオフになっているため、機能していませんでした。それは私が許可したいことではありませんが。

私の解決策は、Request.Form を使用して実際のフォーム送信データ取得に戻すことでした。

protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
            SortBy = Convert.ToInt16(Request.Form[this.ddl_SortBy.UniqueID]);

        // search directory
        SearchDirectory();
    }

今ではまったく問題なく動作します:)
みんなありがとう。

于 2012-07-10T12:34:44.827 に答える
0

イベント ハンドラーの割り当てを OnLoad から OnInit に移動し、SelectedIndex 行を削除します。

protected void Page_Init(object sender, EventArgs e)
{
    this.ddl_SortBy.SelectedIndexChanged += new EventHandler(ddl_SortBy_SelectedIndexChanged);
}

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
        SearchDirectory(); 
}
于 2012-07-10T12:25:09.867 に答える
-1

この簡単な回避策はどうですか。ドロップダウンの最初の項目を次のように設定します。

<asp:ListItem Value="-1">(choose how to sort)</asp:ListItem>

これにより、選択したインデックスが変更され、ユーザーが目的の並べ替え順序を選択したときにイベントが発生します。

最初にコードビハインドからドロップダウンを使って余分な手間を省きます。

于 2012-07-10T12:23:08.760 に答える