C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

チェックリストボックスのフォーカスについて /犬夜叉 (20/01/15(Wed) 08:41) #93698
Re[1]: チェックリストボックスのフォーカスについて /犬夜叉 (20/01/15(Wed) 10:16) #93699
Re[1]: チェックリストボックスのフォーカスについて /KOZ (20/01/15(Wed) 13:04) #93700
  └ Re[2]: チェックリストボックスのフォーカスについて /犬夜叉 (20/01/17(Fri) 11:20) #93705
    └ Re[3]: チェックリストボックスのフォーカスについて /KOZ (20/01/17(Fri) 12:26) #93706
      └ Re[4]: チェックリストボックスのフォーカスについて /犬夜叉 (20/01/17(Fri) 16:32) #93707 解決済み


親記事 / ▼[ 93699 ] ▼[ 93700 ]
■93698 / 親階層)  チェックリストボックスのフォーカスについて
□投稿者/ 犬夜叉 (37回)-(2020/01/15(Wed) 08:41:48)

分類:[.NET 全般] 

2020/01/15(Wed) 08:42:27 編集(投稿者)
チェックリストボックスにフォーカスが移動しないように
以下のようにしたのですが思った通りに動作しませんでした。
創造ではチェックリストボックスではなくその中のチェックボックスに対して
処理しないとだめなのだと思いますが
どうすればよいのでしょうか?

CheckedListBox clbInpu;

clbInput.GetType().InvokeMember("SetStyle", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null,
clbInput, new object[] { ControlStyles.Selectable, false });

[ □ Tree ] 返信 編集キー/

▲[ 93698 ] / 返信無し
■93699 / 1階層)  Re[1]: チェックリストボックスのフォーカスについて
□投稿者/ 犬夜叉 (38回)-(2020/01/15(Wed) 10:16:03)
ちなみに現状では
パネルの上にチェックボックスを配置して
すべてのチェックボックスに以下の処理を行って
代替しています。

ckb.GetType().InvokeMember("SetStyle", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null,
ckb, new object[] { ControlStyles.Selectable, false });
[ 親 93698 / □ Tree ] 返信 編集キー/

▲[ 93698 ] / ▼[ 93705 ]
■93700 / 1階層)  Re[1]: チェックリストボックスのフォーカスについて
□投稿者/ KOZ (79回)-(2020/01/15(Wed) 13:04:16)
2020/01/15(Wed) 13:04:39 編集(投稿者)
No93698 (犬夜叉 さん) に返信

ControlStyles.Selectable を False にすると、Tab キーを押したときに移動先にならなくなるだけです。
TabStop プロパティとの違いは、SelectNextControl メソッドを呼び出したとき、tabStopOnly = false にしたときにも移動先にならないこと。

フォーカスを取得したら、別のコントロールに位置付けるようにすれば良いと思います。

ただし、チェックボックスの ON/OFF ができなくなるので、MouseDown イベントで

var index = clbInput.IndexFromPoint(e.Location);
if (index != -1) {
    clbInput.SetItemChecked(index, !clbInput.GetItemChecked(index));
}

のようにします。

[ 親 93698 / □ Tree ] 返信 編集キー/

▲[ 93700 ] / ▼[ 93706 ]
■93705 / 2階層)  Re[2]: チェックリストボックスのフォーカスについて
□投稿者/ 犬夜叉 (39回)-(2020/01/17(Fri) 11:20:38)
No93700 (KOZ さん) に返信

> フォーカスを取得したら、別のコントロールに位置付けるようにすれば良いと思います。
すみません、具体的にどうすればよろしいのでしょうか?


やりたいことは

チェックリストボックスに "A", "B", "C" のチェックボックスがあった場合、
選択されているテキストボックスに
"A"がチェックされたら "A"
"A"と"B"がチェックされたら"A,B"
が入力されるようにしたいのです。



[ 親 93698 / □ Tree ] 返信 編集キー/

▲[ 93705 ] / ▼[ 93707 ]
■93706 / 3階層)  Re[3]: チェックリストボックスのフォーカスについて
□投稿者/ KOZ (80回)-(2020/01/17(Fri) 12:26:45)
No93705 (犬夜叉 さん) に返信
>>フォーカスを取得したら、別のコントロールに位置付けるようにすれば良いと思います。
> すみません、具体的にどうすればよろしいのでしょうか?

こんな感じでどうでしょう?

public Form1() {
    InitializeComponent();

    clbInput.Enter += (sender, e) => {
        prevControl?.Focus();
    };
    clbInput.MouseDown += (sender, e) => {
        var index = clbInput.IndexFromPoint(e.Location);
        if (index != -1) {
            clbInput.SetItemChecked(index, !clbInput.GetItemChecked(index));
        }
        var txt = prevControl as TextBox;
        if (txt != null) {
            var lst = new List<string>();
            foreach (var selectedItem in clbInput.CheckedItems) {
                lst.Add(selectedItem.ToString());
            }
            prevControl.Text = string.Join(",", lst.ToArray());
        }
    };
    foreach (var con in GetControls(this)) {
        con.Enter += (sender, e) => {
            prevControl = (Control)sender;
        };
    }
}

private Control prevControl;

private static List<Control> GetControls(Control con) {
    var lst = new List<Control>();
    lst.Add(con);
    if (con.HasChildren) {
        foreach (Control child in con.Controls) {
            lst.AddRange(GetControls(child));
        }
    }
    return lst;
}


[ 親 93698 / □ Tree ] 返信 編集キー/

▲[ 93706 ] / 返信無し
■93707 / 4階層)  Re[4]: チェックリストボックスのフォーカスについて
□投稿者/ 犬夜叉 (40回)-(2020/01/17(Fri) 16:32:31)
No93706 (KOZ さん) に返信

ありがとうございました。
プログラムを見てやっと処理を理解することができました。
お手数をおかけしてどうもすみませんでした。

こんな感じでイベントの処理が作成できるとは知りませんでした。
> clbInput.Enter += (sender, e) => {
>  prevControl?.Focus();
> };

また、GetControls は再帰を使ってすべてのコントロールに
イベント追加してるんですね。

私はプロパティを使って一つ一つコントロールを選択して
イベントコードを作成する方法しか知りませんでした。

いろいろ勉強できてとてもよかったです。
解決済み
[ 親 93698 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -