🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Visual Studio

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

VB.NET

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

Q&A

解決済

1回答

1620閲覧

動的に生成したコントロールのプロパティを変更したい。

hanbee.com

総合スコア52

Visual Studio

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

VB.NET

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

0グッド

0クリップ

投稿2020/11/29 06:27

編集2020/11/29 07:39

いつもお世話になっております。
・実現したいこと
WindowsFormApplicationで備品管理アプリを作っています。
LOADイベントで備品の写真を以下に示すコードによって各々表示していますが、処理が終了したあと
Kousinプロシージャで備品を新しいimageプロパティに変更したいと思っているのですが、
これが想定通り動いてくれていません。古いイメージのまま何も反映されていません。

表題の件ですが、
https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/ca2b6a53-fdf9-40d2-b0e6-88e09f62c25e/21205303401239529983251041237512383124671253112488125251254012
多分この質問の投稿者の方と私のやりたいことは同じです。
Form1のLOADイベントで生成したコントロールのプロパティを別のプロシージャ(Kousin)で変更したいと考えています。
以下にソースコードを示します。

'ピクチャーボックスコントロール配列のフィールドを作成 Private bihin(,) As System.Windows.Forms.PictureBox Private Sub Form1_Load(sender as object, e as eventargs) handles mybase.load 'ピクチャーボックスコントロール配列の作成 me.bihin = new picturebox(3,7){} 'ピクチャーボックスコントロールのインスタンス作成し、プロパティを設定する For i as integer = 0 to 3 For j as integer = 0 to 7 Me.bihin(i, j) = New System.Windows.Forms.PictureBox() bihin(i, j).Location = New Point(25 + j * 13, 28 + 48 * i) bihin(i, j).Size = New Size(10, 22) bihin(i, j).Name = "bihin_" & i + 1 & j + 1 'パネル1のコントロールに含める       panel1.Controls.Add(bihin(i, j)) Next Next End Sub Private Sub panel1_click(sender As Object, e As EventArgs) 'panel1をクリックしたら別フォームが開き、備品に対する処理を行う。 Dim t As New 貸出/返却フォーム t.tana_kigou = "C" t.SetBounds(Me.Left, Me.Top, Me.Width, Me.Height) t.ShowDialog(Me) t.Dispose()     '処理が終わればKousinを呼び出して、備品のimageプロパティを新しいものに変える Call Kousin(sender, e) End Sub Private Sub Kousin(sender as object, e as eventargs) Dim fs as Filestream Dim img as image Dim newimg as image '新しいimageをデータベースから取り出します。 Dim conn as npgsqlconnection Dim newdata as string =command.ExecuteScalar() '古いイメージをdisposeして新しいimageを表示します。   For i As Integer = 0 To 3 For j As Integer = 0 To 7      fs = File.OpenRead(newdata)      newimg = Image.FromStream(fs, False, False)      Dim oldImage = bihin(i, j).Image      bihin(i, j).Image = newimg        oldImage?.Dispose()     Next   Next End Sub

上記コードのように書いているのですが、Kousinプロシージャが想定通り動いていてくれず、表示されるのは古いイメージのままです。
どこが問題なのかわかる方がおられましたら助言いただけませんか。よろしくお願いいたします。

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

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

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

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

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

gentaro

2020/11/29 07:11

「想定通り動いていてくれず」の「想定」とはいったいどんなものなんでしょう。 そのKoushinというのは何かのイベントハンドラのつもりで作ったメソッドなんですか? だとすると、どのイベントで発火される想定なんでしょう。 情報が足りなさすぎてなにをしたいのかわからんので、質問文を編集して詳しい解説を追記してください。
YAmaGNZ

2020/11/29 07:15

newdataがどうなっているか確認されたんですかね?
hanbee.com

2020/11/29 07:42

gentaroさん、コメントありがとうございます。 質問文を修正いたしました。貸出/返却と様々な処理の後にKousinを呼び出ししています。 これで大丈夫でしょうか。説明が足りず、申し訳ありません。
hanbee.com

2020/11/29 07:43

YAmaGNZさん、コメントありがとうございます。 Kousinのコード上を走っていることは確認済みですが、newdataが更新されているかは確かに確認していません。確認します。ありがとうございます。
hanbee.com

2020/11/29 08:29

確認したところ、最初のFor文に問題がありそうでした。 For i as integer = 0 to 3 For j as integer = 0 to 7 Me.bihin(i, j) = New System.Windows.Forms.PictureBox() bihin(i, j).Location = New Point(25 + j * 13, 28 + 48 * i) bihin(i, j).Size = New Size(10, 22) bihin(i, j).Name = "bihin_" & i + 1 & j + 1 'パネル1のコントロールに含める       panel1.Controls.Add(bihin(i, j)) Next Next のところでデータベースにデータのない(i, j)の場所では写真が表示されておらず、 だからKousinでimageプロパティを変えたところで意味がなかったということが分かりました。 これで先に進めそうです。ありがとうございます。 まだ完全に直し切れていないので、修正を続けてまた報告します。
hanbee.com

2020/11/29 08:44

解決しました。無事、想定通りの動きが実現できました。 説明が足りず、いろいろとお手数をおかけして申し訳ありませんでしたが、 おかげで現状把握が進み、糸口が掴めました。 bihin(i,j)は全部が表示されているわけではなく、、そこの説明ができていなかったので、 回答者様には検討の余地がない質問になってしまっていて、反省します。 しかし、ハッキリと回答いただけたことで迷うことなく、プロパティを変えることで 備品の写真は変わるはずだと確信して解析できました。本当にありがとうございました。
hanbee.com

2021/01/10 09:45

思うのですが、 Dim oldImage = bihin(i, j).Image oldImage?.Dispose() という部分は必要なのでしょうか? 単にコントロールのプロパティを変更するだけならば、以下のようにしてもいいはずですよね? fs = File.OpenRead(newdata) newimg = Image.FromStream(fs, False, False) bihin(i, j).Image = newimg 実は、この質問で修正した部分とほぼ同じ動作をするところでここでやったようにうまく動いてくれず、 先に出した2文をコメントアウトしたら動くようになりました。 先に出した2文は直感的にどうも目的である「アンマネージドリソースの解放」をしているとは思えず、 新たに「oldimage」というimageを生成させ、それをdisposeしているようにしか見えないのです。 bihin(i,j)のコントロールのプロパティをnewimgに置き換えるだけの3文では「アンマネージドリソースの解放」はしてくれないから、やはり2文の意味はあるんですかね。。。
guest

回答1

0

ベストアンサー

Private Sub Kousin(sender as object, e as eventargs)
Dim fs as Filestream
Dim img as image
Dim newimg as image

①>> '新しいimageをデータベースから取り出します。
①>> Dim conn as npgsqlconnection
①>> Dim newdata as string =command.ExecuteScalar()

'古いイメージをdisposeして新しいimageを表示します。
For i As Integer = 0 To 3
For j As Integer = 0 To 7
fs = File.OpenRead(newdata)
newimg = Image.FromStream(fs, False, False)
Dim oldImage = bihin(i, j).Image
bihin(i, j).Image = newimg
oldImage?.Dispose()
Next
Next
End Sub

①の部分にいろいろパラメータややり方が足りてない気がします
参考にこのページのようにconnの初期化やcommandの初期化をしてみて試したらどうでしょうか?
そちらで使っているデータベースと設定が違うはずなのでコピペしても動かないです
調べて書き直してみてくださいね

https://vdlz.xyz/Csharp/Database/Postgre/Npgsql/Doc/Npgsql_Doc_004.html
NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=joe;Password=secret;Database=joedata;");
conn.Open();
NpgsqlCommand command = new NpgsqlCommand("select version()", conn);
serverversion = (String)command.ExecuteScalar();

投稿2020/12/29 08:18

yukiyuki123456

総合スコア130

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

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

hanbee.com

2021/01/10 09:50

①の部分はソースコードに必要ないと思い、省略していますが、 SQLに送れるようなcode文も記述していますし、実際読み出せていますし、 大丈夫だと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問