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

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

詳細はこちら
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VB.NET

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

Q&A

解決済

1回答

3276閲覧

VB コンボボックス 選択行によって編集不可、可の切り替えをしたい

kou1

総合スコア0

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VB.NET

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

0グッド

0クリップ

投稿2020/12/28 01:50

編集2020/12/28 07:53

前提・実現したいこと

フォームにコンボボックスを配置して、1行目を選択時は、編集不可としたい、
それ以外は、編集可能状態としたいと思っています。
簡単に実装してみたのですが、異常終了が発生するようで原因が分からず困っております。

発生している問題・エラーメッセージ

動作をさせていると、思っている挙動をするのですが、何度も同じことをさせていると以下のエラーメッセージが出て
フォームが落ちます。

System.AccessViolationException: 'Attempted to read or write protected memory. This is often an indication that other memory is corrupt.'

該当のソースコード

開発言語:VisualStudio2015.Visual Basic
動作環境:Windows10 Home 、バージョン:20H2

試したこと

以下のようなコーディングをしているのですが何か問題がありますでしょうか?

Public Class Form1
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmb1.SelectedIndexChanged

If Me.cmb1.SelectedIndex = 0 Then Me.cmb1.DropDownStyle = ComboBoxStyle.DropDownList Else Me.cmb1.DropDownStyle = ComboBoxStyle.DropDown End If End Sub Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.cmb1.Items.Add("1111") Me.cmb1.Items.Add("2222") End Sub

End Class

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/12/28 05:55 編集

AccessViolationExceptionは.NETプログラムの通常の操作では発生しない例外ですが、提示されたコード以外の部分が影響している事も考えられます。必要最小限のコードでプロジェクトを新規に作成しても、同じ現象は再現しますか?
kou1

2020/12/28 05:53

ありがとうございます。 すみません、初めての投稿で分かっていないところも多いのですが C#ではなく、VBなのですが、書くところを間違えていますでしょうか? 業務で使用しているアプリに実装したところ、事象が確認されたので、自宅で確認しようと 思い、初期のフォームにコンボボックスを張り付けて、 フォームのLoad時に、2行アイテムをセットしたぐらいで、 上記のコーディング(ComboBox1_SelectedIndexChanged)をしただけです。 原因が分からず困っております。。。
退会済みユーザー

退会済みユーザー

2020/12/28 05:56 編集

ああ、すみませんC#ではなく.NETプログラムに訂正しておきます。 コード量が大したことないのであれば、フォームのソースをそのまま載せた方がよいかと思われます。
fumu7

2020/12/28 07:39

気になるのは『何度も同じことをさせていると』という部分です。メモリなどのリソースを確保するだけで、開放し忘れていたり、開放すべきでないリソースを開放したりすると質問のようなエラーが発生する事があります。 https://www.atmarkit.co.jp/ait/articles/1710/18/news022.html の記事が、参考になるかも知れません。
退会済みユーザー

退会済みユーザー

2020/12/28 07:55

インデントが崩れて読みづらくなるので、ソースコードは「コードの挿入」で書くようにしてください。
kou1

2020/12/28 07:59 編集

>radian様 ありがとうございます。 コードの内容を修正しました。フォームを新規作成し、 コンボボックスを張り付け、名前を「cmb1」にすれば確認出来るかと思います。 >fumu7様 ありがとうございます。 もちろん、メモリリーク対策は知っているのですが、このようなコンボボックスの スタイル変更(プロパティ変更)でもメモリリークが発生するということでしょうか?
fumu7

2020/12/28 09:02

エラーの原因は質問に書かれているプログラムではないところで発生していると思います。 『何度も同じことをさせている』うちにメモリリークなどが繰り返し生じて、”System.AccessViolationException”に至ったというシナリオだったのではないかと推測します。 詳細はプログラムのコードがないので判りようがないですが。
kou1

2020/12/28 10:22

>fumu7様 ありがとうございます。 AccessViolationException 自体が、本来してはいけないことをしてしまったみたいな エラーの類という認識はあります。 コードですが、上の方で張り付けているのが全てです。 これで、コンボボックスの選択を変更していると早い場合、3回ぐらいで落ちる時があります。 必ず落ちるという訳でもないので原因が分からず悩んでいます。 要はコンボボックスのある行だけ編集不可にしたいのですが、他にこうすれば出来るという アイディアがあれば教えていただきたく思っております。
YAmaGNZ

2020/12/28 10:57

WPFコントロールの方はIsEditableプロパティで編集の有効無効を切り替えることができるのでWPFのComboBoxをカプセル化したコントロールを作成して、WinFormのほうでElementHostを利用してそのコントロールを使うとかどうでしょうか?
kou1

2020/12/28 12:05

>YAmaGNZさん すいません、VB.net 初めてまだ2ヶ月なので、よく理解出来ていないのですが WPFコントロールとは何ぞや、から調べていきます。 ありがとうございます。
guest

回答1

0

自己解決

すいません、YAmaGNZさんのWPFを試す前に、一度コンボボックスのイベントを確認していたら
「SelectionChangeCommitted」というのがありました。

こちらに処理をまるごと移したところ、AccessViolationの再現性はなくなりました。
まだ数十回試しての結果なのですが、更に回数を増やして問題がなければこの処理を本来のプログラムで
試してみようと思います。

皆さん、ありがとうございました。

投稿2020/12/28 12:25

kou1

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問