質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

2393閲覧

DataGridViewを張り付けたユーザーコントロールを配列化して合計数を計算したい

seesaajira-

総合スコア107

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/01/28 11:01

Visual Basic 2019を使用して倉庫管理を作成中です。

複数倉庫の管理なので、倉庫単位で入力できるユーザーコントロールを作成してみました。
倉庫管理コントロール

しかし、そのコントロールを複数張り付けたフォームで
倉庫全体の合計値を集計しようとしたところ
ユーザーコントロールの配列化する方法がわからず、困っています。

良い方法がございましたら、教えていただけますでしょうか?

よろしくお願いいたします。

イメージ説明

Public Class 倉庫在庫登録画面 Const _最大行数 As Integer = 3 Sub 合計() Try Dim _R列 As Integer 'とりあえず R列のみ集計してみる Dim _R合計 As Integer = 0 For Each c As 倉庫管理コントロール In Me.Controls <=ここでエラーになってしまいます For i = 0 To c.データグリッド.Rows.Count - 1 If Not (i = _最大行数 - 1) Then Dim d As Double Dim _数値チェック As Boolean = Double.TryParse(c.データグリッド(_R列, i).Value, d) If _数値チェック Then _R合計 = _R合計 + c.データグリッド(_R列, i).Value End If End If Next Next nmb_1.Text = _R合計 Catch ex As Exception End Try End Sub Private Sub 倉庫管理コントロール0_Validated(sender As Object, e As EventArgs) Handles 倉庫管理コントロール0.Validated 合計() End Sub End Class

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

VBNET

1Dim Controls = Me.Controls.OfType(Of 倉庫管理コントロール) 2 3For Each c In Controls 4 Debug.WriteLine(c.Name) 5Next

このような形で型を指定して取り出すことができます。

また、合計を算出する必要があるのであれば、まず倉庫管理コントロール側でそのコントロールが保持するデータの合計を取得できるプロパティを用意して、そのプロパティを合計するのがいいのではないでしょうか。
また、計算時に数値かどうかのチェックを行っていますが、これらは入力させているコントロール側が責任を持つべきでコントロール側で実装すべきことなのではないかと思います。
(というか、コントロール内部でも合計を取っていそうなので、そこでも行っているのではないですか?)

例)コントロールにRSumという合計を返すプロパティを実装した場合

VBNET

1Dim Controls = Me.Controls.OfType(Of 倉庫管理コントロール) 2Dim Rsum = Controls.Sum(Function(c) c.RSum)

みたいな感じで

投稿2020/01/28 13:08

編集2020/01/28 13:28
YAmaGNZ

総合スコア10242

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

seesaajira-

2020/01/29 00:42

YAmaGNZさん、早速のご回答ありがとうございます。 頂いたコードで実行してみたところ For Eachの中を通りません。 ちなみに倉庫管理コントロールの部分を, フォームに存在するDateTimePickerに変えると 通ります。 ユーザーコントロールだと取り出す事ができないのでしょうか? ご指摘の通り、数値チェックはユーザーコントロールで行った方が良いですね。 後、合計値をパラメータで持つのは、考えていませんでした。 その方がすっきりしそうですね。
YAmaGNZ

2020/01/29 00:55

よくみたら、TabPage上にコントロールがあるのではないですか? TabPage1.Controls.OfType(Of 倉庫管理コントロール) という風にしてみてください。
seesaajira-

2020/01/29 01:07

tabによく気が付きましたね。流石です! 私も自分で作っていて、存在を忘れていました。 ありがとうございます。 無事、集計できるようになりました。
guest

0

Controls の要素を 倉庫管理コントロール にキャストできずにエラーになっているものと思われます。
いったん Control 型の変数に受けた後、TryCast でキャストできるかを検証するとよさそうです。

vbnet

1For Each c2 As Control In Me.Controls 2 Dim c As 倉庫管理コントロール = TryCast(c2, 倉庫管理コントロール) 3 If c IsNot Nothing Then 4 ' 倉庫管理コントロールに対する処理をここで実施 5 End If 6Next

投稿2020/01/28 11:16

編集2020/01/28 11:17
alg

総合スコア2019

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

seesaajira-

2020/01/29 00:35

algさん、早速のご回答ありがとうございます。 頂いたコードで実行してみたところ If c IsNot Nothing Then でNothingとなって、if文の中を通りませんでした。 ちなみに倉庫管理コントロールの部分を, フォームに存在するDateTimePickerに変えても Nothingとなってしまいます。
seesaajira-

2020/01/29 01:16

原因が判明致しました。 For Each c2 As Control In Me.Controlsの MeをTabPageに変更したところ if文の中を通るようになりました。 私がタブコントロールにユーザーコントロールを 張り付けていたせいでした。 申し訳ございません。 またの機会がございましたら、ご回答宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問