Top / .NET備忘録 / 02.ListBox / 01.NewIndex プロパティ

Sort プロパティを True にした ListBox に行挿入すると並び替えが発生しませんが、行追加すると、並び替えが起きます。 NewIndex プロパティは、その行追加位置を求めるために必要です。

実装方法は簡単。
ウインドウメッセージの LB_ADDSTRING と LB_INSERTSTRING を捕まえれば良いです。 値を保持する変数を確保し、ReadOnly なプロパティとして公開します。

    private int m_NewIndex = -1; // 初期値は -1
 
    public int NewIndex
    {
        get { return m_NewIndex; }
    }

VB6 だとサブクラス化は面倒でしたが、ずいぶん簡単になったもんだなぁと思いつつ WndProc をオーバーライドします。 行削除や、クリアが行われると、-1 に戻っているようなので LB_DELETESTRING と LB_RESETCONTENT も捕まえます。

    const int
    LB_ADDSTRING = 0x0180, 
    LB_INSERTSTRING = 0x0181, 
    LB_DELETESTRING = 0x0182,
    LB_RESETCONTENT = 0x0184; 
 
    [DebuggerStepThrough]
    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case LB_ADDSTRING:
                // 追加されたときは戻り値を NewIndex とする
                base.WndProc(ref m);
                m_NewIndex = m.Result.ToInt32();
                break;
 
            case LB_INSERTSTRING:
                // 挿入されたときは挿入位置 (WParam) が NewIndex 
                base.WndProc(ref m);
                m_NewIndex = m.WParam.ToInt32();
                break;
 
            case LB_DELETESTRING:
            case LB_RESETCONTENT:
                // 削除、クリアされたときは -1 に戻します
                base.WndProc(ref m);
                m_NewIndex = -1;
                break;
 
            default:
                base.WndProc(ref m);
                break;
        }
    }



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2013-03-05 (火) 09:45:00 (1574d)