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

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

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

パネル上にあるコントールから値を取得する方法

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

■92913 / inTopicNo.1)  パネル上にあるコントールから値を取得する方法
  
□投稿者/ 河童 (69回)-(2019/11/07(Thu) 19:57:24)

分類:[C#] 

いつも大変お世話になっております。

パネル上にあるコントールから値を取得する方法について教えてください。

パネル(pnlMain)には、テキストボックス、ラジオボタン、チェックボタン、ラベルなどが配置されています。
・テキストボックス
・ラジオボタン(複数選択なし)
・チェックボタン(複数選択あり)
の入力内容をリストにセットしたいと思っています。

パネルにあるコントロールを調べることはできます。(ネット参照)
パネルにあるコントロールの繰り返し処理を実行して、
テキストボックスの値は取得することができました。

わからないこと点1
ラジオボタンの値をどのように取得すれば良いでしょうか?
chbNaiyou_1_1_1
chbNaiyou_1_1_2
上記のラジオが配置されていて
chbNaiyou_1_1_2が「true」ならば、内容に「2」(コントロール名の右端の数値)とセットしたいです。

わからないこと点2
チェックボックスの値をどのように取得すれば良いでしょうか?
ラジオボタンを同様に値を取得できないです。
チェックボックスは複数選択があるときは、カンマで区切った内容をセットしたいです。
chbNaiyou_1_1_1「true」 chbNaiyou_1_1_2「true」のときの内容「1,2」
コントールの繰り返しの処理の順番がchbNaiyou_1_1_1の次がchbNaiyou_1_1_2でないので、
値のセットするタイミングがわかりません。

ご教示よろしくお願いします。


    public class m_user_info
    {
        public string user_id { get; set; }         // 利用者ID
        public int koumoku_num1 { get; set; }       // 項目番号1
        public int koumoku_num2 { get; set; }       // 項目番号2
        public string control_type { get; set; }    // コントロールの種類
        public string naiyou { get; set; }          // 内容  
    }




        private void button1_Click(object sender, EventArgs e)
        {
  
            
                // パネル上のコントロールを全てを列挙
		// パネル上のコントロールを全てを列挙                
                List<Control> controls = GetAllControls<Control>(pnlMain);

                List<m_user_info> lstNaiyou = new List<m_user_info>();
                string dt = now.ToString("yyyy/MM/dd HH:mm:ss");

                foreach (var ctl in controls)
                {
                    string control_type;
                    string target = ctl.Name;
                    string koumoku_num1 = "";
                    string koumoku_num2 = "";
                    string naiyou = "";

                    // コントロールの入力内容をチェック
                    if (target.Contains("txb")) // テキストボックス
                    {
                        control_type = "txb";
                        string[] arr = target.Split('_');

                        // 要素数チェック(例:txbNaiyou_1_1)
                        if (arr.Length != 3) continue;
                        
                        koumoku_num1 = arr[1];
                        koumoku_num2 = arr[2];

                        naiyou = ctl.Text;
                     
                    }
                    else if (target.Contains("rdb")) // ラジオボタン
                    {
                        control_type = "rdb";
                        string[] arr = target.Split('_');

                        // 要素数チェック(例:rdbNaiyou_1_1_1)
                        if (arr.Length != 4) continue;

                        koumoku_num1 = arr[1];
                        koumoku_num2 = arr[2];

                        // わからない点1(ラジオボタンの値「True」判定方法)
                        //naiyou = ctl.value;

                    }
                    else if (target.Contains("chb")) // チェックボックス(複数選択あり)
                    {
                        control_type = "chb";
                        string[] arr = target.Split('_');

                        // 要素数チェック(例:chbNaiyou_1_1_1)
                        if (arr.Length != 4) continue;

                        koumoku_num1 = arr[1];
                        koumoku_num2 = arr[2];

                        // わからない点2(複数選択のときは、内容に「,」区切りで結合してリストに入れたい)
                        // chbNaiyou_1_1_1「true」 chbNaiyou_1_1_2「true」のときの内容「1,2」
                    }
                    else
                    {
                        continue;
                    }

                    // 入力内容をリストにセット
                    m_user_info d = new m_user_info();
                  
                    d.user_id = UserId;
                    d.koumoku_num1 = int.Parse(koumoku_num1);
                    d.koumoku_num2 = int.Parse(koumoku_num2);
                    d.control_type = control_type;
                    d.naiyou = naiyou;

                    lstNaiyou.Add(d);

        }

        /// <summary>
        /// 指定のコントロール上の全てのジェネリック型 Tコントロールを取得する。
        /// </summary>
        /// <typeparam name="T">対象となる型</typeparam>
        /// <param name="top">指定のコントロール</param>
        /// <returns>指定のコントロール上の全てのジェネリック型 Tコントロールのインスタンス</returns>
        public static List<T> GetAllControls<T>(Control top) where T : Control
        {
            List<T> buf = new List<T>();
            foreach (Control ctrl in top.Controls)
            {
                if (ctrl is T) buf.Add((T)ctrl);
                buf.AddRange(GetAllControls<T>(ctrl));
            }
            return buf;
        }






引用返信 編集キー/
■92914 / inTopicNo.2)  Re[1]: パネル上にあるコントールから値を取得する方法
□投稿者/ shu (1205回)-(2019/11/08(Fri) 09:25:51)
No92913 (河童 さん) に返信

> わからないこと点1
> ラジオボタンの値をどのように取得すれば良いでしょうか?
> chbNaiyou_1_1_1
> chbNaiyou_1_1_2
> 上記のラジオが配置されていて
> chbNaiyou_1_1_2が「true」ならば、内容に「2」(コントロール名の右端の数値)とセットしたいです。
chbNaiyou_1_1_2.checkedを確認すればよいです。


>
> わからないこと点2
> チェックボックスの値をどのように取得すれば良いでしょうか?
> ラジオボタンを同様に値を取得できないです。
チェックボックスもcheckedを確認すればよいです。
チェックボックスに対し何らかの値を対応させたい場合は別途プログラム上で処理を行う必要があります。

> チェックボックスは複数選択があるときは、カンマで区切った内容をセットしたいです。
文字列連結時にカンマを間に挟むように連結するとよいです。


> chbNaiyou_1_1_1「true」 chbNaiyou_1_1_2「true」のときの内容「1,2」
> コントールの繰り返しの処理の順番がchbNaiyou_1_1_1の次がchbNaiyou_1_1_2でないので、
> 値のセットするタイミングがわかりません。
>
繰り返しの順番が決まっているのなら
処理する順番に配列に設定したものを用意すると処理しやすいかと思います。

> List<T> buf = new List<T>();
> foreach (Control ctrl in top.Controls)
> {
> if (ctrl is T) buf.Add((T)ctrl);
> buf.AddRange(GetAllControls<T>(ctrl));
> }
> return buf;
ここでうまく順番通りになるようにするか、top.Controlsを使わず固定で配列初期化を行うようにする。

引用返信 編集キー/
■92915 / inTopicNo.3)  Re[2]: パネル上にあるコントールから値を取得する方法
□投稿者/ 河童 (70回)-(2019/11/08(Fri) 09:57:10)
No92914 (shu さん) に返信

おはようございます。shu さん、お返事ありがとうございます。

  
>>わからないこと点1
>>ラジオボタンの値をどのように取得すれば良いでしょうか?
>>chbNaiyou_1_1_1
>>chbNaiyou_1_1_2
>>上記のラジオが配置されていて
>>chbNaiyou_1_1_2が「true」ならば、内容に「2」(コントロール名の右端の数値)とセットしたいです。
> chbNaiyou_1_1_2.checkedを確認すればよいです。

今回は、コントロール取得の繰り返しの処理中に
ラジオボタンの状態が知りたかったです。

下記の様にすると、判定することができました。
同様にチェックボタンの方も判定できそうです。

if (((RadioButton)ctl).Checked == true)
{
  naiyou = btn_num;
}
                        

>>わからないこと点2 
> 繰り返しの順番が決まっているのなら
> 処理する順番に配列に設定したものを用意すると処理しやすいかと思います。 
>> List<T> buf = new List<T>();
>>           foreach (Control ctrl in top.Controls)
>>           {
>>               if (ctrl is T) buf.Add((T)ctrl);
>>               buf.AddRange(GetAllControls<T>(ctrl));
>>           }
>>           return buf;
> ここでうまく順番通りになるようにするか、top.Controlsを使わず固定で配列初期化を行うようにする。
そうですね。パネルに配置するコントールは決まっているので、
コントロールのリストを作成して試してみます。



引用返信 編集キー/
■92917 / inTopicNo.4)  Re[3]: パネル上にあるコントールから値を取得する方法
□投稿者/ 河童 (71回)-(2019/11/08(Fri) 12:49:09)
No92914 (shu さん) に返信

コントロールのリストを作成して、
ラジオボタンでキャストしてやれば、値を取得することができるようになりました。

値は、
rdb.Checked.ToString()
で取得できるようになりました。
解決済み
引用返信 編集キー/

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


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

このトピックに書きこむ