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

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

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

チェックリストボックスのフォーカスについて

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■93698 / inTopicNo.1)  チェックリストボックスのフォーカスについて
  
□投稿者/ 犬夜叉 (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 });

引用返信 編集キー/
■93699 / inTopicNo.2)  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 });
引用返信 編集キー/
■93700 / inTopicNo.3)  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));
}

のようにします。

引用返信 編集キー/
■93705 / inTopicNo.4)  Re[2]: チェックリストボックスのフォーカスについて
□投稿者/ 犬夜叉 (39回)-(2020/01/17(Fri) 11:20:38)
No93700 (KOZ さん) に返信

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


やりたいことは

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



引用返信 編集キー/
■93706 / inTopicNo.5)  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;
}


引用返信 編集キー/
■93707 / inTopicNo.6)  Re[4]: チェックリストボックスのフォーカスについて
□投稿者/ 犬夜叉 (40回)-(2020/01/17(Fri) 16:32:31)
No93706 (KOZ さん) に返信

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

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

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

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

いろいろ勉強できてとてもよかったです。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ