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

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

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

GROUPBOXの複製について(VB.NET)

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

■95177 / inTopicNo.1)  GROUPBOXの複製について(VB.NET)
  
□投稿者/ 北松 (1回)-(2020/06/29(Mon) 11:58:36)

分類:[VB.NET/VB2005 以降] 

VB.NETでプログラミング中です。

WindowsFormにて、
Form1内にGroupBox1を作成し、
GroupBox1内に複数のLabelやTextBoxを配置しています。
TextBoxには住所や氏名を入力し、
Botton1クリックイベントでデータベースにレコードを登録します。

【ここからやりたいこと】
Botton2クリックイベントにてGroupBox1を複製し、真下にGroupBox2を作成し
たい。
作成されたGroupBox2内のTextBoxはすべてブランク。
Botton2クリックイベントのたび、GroupBox3、GroupBox4と追加する。
GroupBox1とGroupBox2にそれぞれ情報を入力し、別レコードとしてデータベー
スに登録する。
【ここまでやりたいこと】

上記処理は可能でしょうか?
可能な場合、サンプル等ご教授いただければ幸いです。

不可の場合、代替手段があれば教えてください。

よろしくお願いします。
引用返信 編集キー/
■95178 / inTopicNo.2)  Re[1]: GROUPBOXの複製について(VB.NET)
□投稿者/ kiku (183回)-(2020/06/29(Mon) 12:05:41)
No95177 (北松 さん) に返信
> 【ここからやりたいこと】
> Botton2クリックイベントにてGroupBox1を複製し、真下にGroupBox2を作成し
> たい。
> 作成されたGroupBox2内のTextBoxはすべてブランク。
> Botton2クリックイベントのたび、GroupBox3、GroupBox4と追加する。
> GroupBox1とGroupBox2にそれぞれ情報を入力し、別レコードとしてデータベー
> スに登録する。
> 【ここまでやりたいこと】

下記が参考になると思います。
https://dobon.net/vb/dotnet/control/addcontrol.html
引用返信 編集キー/
■95183 / inTopicNo.3)  Re[2]: GROUPBOXの複製について(VB.NET)
□投稿者/ 北松 (3回)-(2020/06/29(Mon) 15:08:18)
No95178 (kiku さん) に返信
> 下記が参考になると思います。
> https://dobon.net/vb/dotnet/control/addcontrol.html

ありがとうございます。
GroupBoxを追加する際、Nameプロパティの設定やLacationプロパティの指定について
フォーム内のGroupBoxの個数を変数として扱いたいのですが、うまくいきません。

Dim i As Integer = GetGroupBoxCount(Me)
Private Function GetGroupBoxCount(ByVal Ctrl As Control) As Integer
If Ctrl.Controls.Count = 0 Then
If TypeOf Ctrl Is GroupBox Then
Return 1
Else
Return 0
End If
End If

Dim i As Integer
For Each c As Control In Ctrl.Controls
i += GetGroupBoxCount(c)
Next
Return i
Me.Controls.Count.ToString()
End Function

でiが0以外になりません。
間違いをご指摘いただければ幸いです。
引用返信 編集キー/
■95184 / inTopicNo.4)  Re[3]: GROUPBOXの複製について(VB.NET)
□投稿者/ kiku (184回)-(2020/06/29(Mon) 15:36:35)
No95183 (北松 さん) に返信
> ■No95178 (kiku さん) に返信
>>下記が参考になると思います。
>>https://dobon.net/vb/dotnet/control/addcontrol.html
>
> ありがとうございます。
> GroupBoxを追加する際、Nameプロパティの設定やLacationプロパティの指定について
> フォーム内のGroupBoxの個数を変数として扱いたいのですが、うまくいきません。
>
> Dim i As Integer = GetGroupBoxCount(Me)
> Private Function GetGroupBoxCount(ByVal Ctrl As Control) As Integer
> If Ctrl.Controls.Count = 0 Then
> If TypeOf Ctrl Is GroupBox Then
> Return 1
> Else
> Return 0
> End If
> End If
>
> Dim i As Integer
> For Each c As Control In Ctrl.Controls
> i += GetGroupBoxCount(c)
> Next
> Return i
> Me.Controls.Count.ToString()
> End Function
>
> でiが0以外になりません。
> 間違いをご指摘いただければ幸いです。

C#ならよかったのですが、VB.NETは良くわからないので
概要だけ回答します。

1.Controlsからforeachで取り出し
2.TypeOfでGroupBoxであったら、カウントを1つ増やす

引用返信 編集キー/
■95187 / inTopicNo.5)  Re[3]: GROUPBOXの複製について(VB.NET)
□投稿者/ 魔界の仮面弁士 (2764回)-(2020/06/29(Mon) 18:53:39)
No95183 (北松 さん) に返信
>  Return i
>  Me.Controls.Count.ToString()
> End Function

Return の後に処理を書いても、その行は実行されませんよ。


> Private Function GetGroupBoxCount(ByVal Ctrl As Control) As Integer
>  If Ctrl.Controls.Count = 0 Then
>   If TypeOf Ctrl Is GroupBox Then
>    Return 1
>   Else
>    Return 0
>   End If
>  End If

これだと、「子コントロールを貼っていない GroupBox」は 1 件としてカウントされますが、
「子コントロールを含んだ GroupBox」は 0 としてカウントされます。


もしも、「子コントロールを貼っているかどうかは関係なく、GroupBox の総数を得ること」を目的としているなら、
そもそも Ctrl.Controls.Count が 0 であるかを調べる必要はないはずです。
例えばこんな感じで書けるでしょう。


 ' 案1
 Private Function GetGroupBoxCount(ByVal Ctrl As Control) As Integer
  Dim i As Integer = If(TypeOf Ctrl Is GroupBox, 1, 0)
  For Each c As Control In Ctrl.Controls
   i += GetGroupBoxCount(c)
  Next
  Return i
 End Function

 ' 案2
 Private Function GetGroupBoxCount(ByVal Ctrl As Control) As Integer
  GetGroupBoxCount = Ctrl.Controls.OfType(Of GroupBox)().Count()
  For Each child As Control In Ctrl.Controls
   GetGroupBoxCount += GetGroupBoxCount(child)
  Next
 End Function



あるいは、Ctrl.Controls.Count を見ていたのは意図したものであるのだとしたら、提示されたコードは、
「子を持たない、空の GroupBox を数えること」を目的としたものということになります。
この場合、処理の意図が伝わるよう、Function の名前を
GetEmptyGroupBoxCount あたりに変えた方が良いかもしれません。
引用返信 編集キー/
■95213 / inTopicNo.6)  Re[4]: GROUPBOXの複製について(VB.NET)
□投稿者/ 北松 (4回)-(2020/07/02(Thu) 09:51:48)
No95187 (魔界の仮面弁士 さん) に返信

>  ' 案1
>  Private Function GetGroupBoxCount(ByVal Ctrl As Control) As Integer
>   Dim i As Integer = If(TypeOf Ctrl Is GroupBox, 1, 0)
>   For Each c As Control In Ctrl.Controls
>    i += GetGroupBoxCount(c)
>   Next
>   Return i
>  End Function
>
>  ' 案2
>  Private Function GetGroupBoxCount(ByVal Ctrl As Control) As Integer
>   GetGroupBoxCount = Ctrl.Controls.OfType(Of GroupBox)().Count()
>   For Each child As Control In Ctrl.Controls
>    GetGroupBoxCount += GetGroupBoxCount(child)
>   Next
>  End Function
>

上記でGroupBoxの個数を取得できました。
ありがとうございます。

解決済み
引用返信 編集キー/

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


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

このトピックに書きこむ