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

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

新規登録して質問してみよう
ただいま回答率
85.31%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

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

Q&A

解決済

1回答

1650閲覧

DataGridViewのカスタムコントロールのビルドエラーについて

ohno1011

総合スコア14

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

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

0グッド

0クリップ

投稿2023/06/29 04:28

実現したいこと

https://teratail.com/questions/iz38sxqefzlx0z
↑の質問にて、C#でDataGridViewの編集中セルのEnterでのセル移動を制御するために
カスタムコントロールを作りました。

VB.NETでも同様のことをしたいのですが、エラー一覧にエラーは表示されませんが、
デバッグを実行すると「ビルドエラーが発生しました。続行して、最後に成功したビルドを実行しますか?」
のメッセージが表示されます。

正しいコードがわかりましたら教えて頂きたいです。

出力 を見ると、デバッグ実行時に以下の表示が出ています。

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

1. error BC30928: クラス 'DataGridViewEX' に指定された基本クラス 'DataGridView' は、その他の Partial 型の 1 つである基本クラス 'Control' と異なることはできません。 2. error BC30284: 基底クラスで function をオーバーライドしないため、function 'ProcessDataGridViewKey' を 'Overrides' として宣言することはできません。

該当のソースコード

VB.NET

1Imports System.ComponentModel 2 3Public Class DataGridViewEX 4 Inherits DataGridView 5 6 Public Sub New() 7 InitializeComponent() 8 End Sub 9 10 Public Event PressEnter As EventHandler(Of CancelEventArgs) 11 12 <System.Security.Permissions.UIPermission(System.Security.Permissions.SecurityAction.Demand, Window:=System.Security.Permissions.UIPermissionWindow.AllWindows)> 13 Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean 14 If (keyData And Keys.KeyCode) = Keys.Enter Then 15 16 If Not OnPressEnter() Then 17 Return MyBase.ProcessDialogKey(keyData) 18 Else 19 Return True 20 End If 21 End If 22 23 Return MyBase.ProcessDialogKey(keyData) 24 End Function 25 26 <System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, Flags:=System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)> 27 Protected Overrides Function ProcessDataGridViewKey(ByVal e As KeyEventArgs) As Boolean 28 If e.KeyCode = Keys.Enter Then 29 30 If Not OnPressEnter() Then 31 Return MyBase.ProcessDataGridViewKey(e) 32 Else 33 Return True 34 End If 35 End If 36 37 Return MyBase.ProcessDataGridViewKey(e) 38 End Function 39 40 Private Function OnPressEnter() As Boolean 41 If PressEnterEvent IsNot Nothing Then 42 Dim e As CancelEventArgs = New CancelEventArgs() 43 RaiseEvent PressEnter(Me, e) 44 Return e.Cancel 45 End If 46 47 Return False 48 End Function 49 50 Protected Overrides Sub OnPaint(ByVal pe As PaintEventArgs) 51 MyBase.OnPaint(pe) 52 End Sub 53End Class

試したこと

・4行目のInherits DataGridViewを Inherits Controlに変更

ビルド時の出力に表示される1.のエラーは表示されなくなりますが、
17行目と23行目のProcessDataGridViewKeyに対して
エラー BC30456 'ProcessDataGridViewKey' は 'Control' のメンバーではありません。
というエラーがエラー一覧に表示されます。

・13行目と27行目のProtected Overrides のOverridesを削除

ビルド時の出力に表示される2.のエラーは表示されなくなりますが、

警告 BC40005 function 'ProcessDialogKey' は、ベース class 'DataGridView' のオーバーライド可能なメソッドをシャドウします。ベース メソッドをオーバーライドするには、このメソッドは 'Overrides' に宣言されていなければなりません。
という警告がエラー一覧に表示されます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

これを作成する際にどのように作成されたのでしょうか?
既存のコントロールを継承したコントロールを作成されるのであればプロジェクトにユーザーコントロールを追加するのではなく
通常のクラスを追加して作成しましょう。

その時は

VBNET

1 Public Sub New() 2 InitializeComponent() 3 End Sub

このようなコンストラクタは必要ありません。


追記

何故このようなことになったかというと、カスタムコントロールを追加すると
CustomControl1.Designer.vbといった感じの隠しファイルが自動生成されて、

VBNET

1<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ 2Partial Class CustomControl1 3 Inherits System.Windows.Forms.Control 4 5 'Control は、コンポーネント一覧に後処理を実行するために、dispose をオーバーライドします。 6 <System.Diagnostics.DebuggerNonUserCode()> _ 7 Protected Overrides Sub Dispose(ByVal disposing As Boolean) 8 Try 9 If disposing AndAlso components IsNot Nothing Then 10 components.Dispose() 11 End If 12 Finally 13 MyBase.Dispose(disposing) 14 End Try 15 End Sub 16 17 'コントロール デザイナーで必要です。 18 Private components As System.ComponentModel.IContainer 19 20 ' メモ: 以下のプロシージャはコンポーネント デザイナーで必要です。 21 ' コンポーネント デザイナーを使って変更できます。 22 ' コード エディターを使って変更しないでください。 23 <System.Diagnostics.DebuggerStepThrough()> _ 24 Private Sub InitializeComponent() 25 components = New System.ComponentModel.Container() 26 End Sub 27 28End Class 29

という感じでコードが自動生成されます。
そこにInherits System.Windows.Forms.ControlとControlを継承するように記載されているので、自分で書いたInherits DataGridViewと型が異なるというエラーが発生することになります。

投稿2023/06/29 04:51

編集2023/06/29 06:11
YAmaGNZ

総合スコア10542

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

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

ohno1011

2023/06/29 05:58

YAmaGNZさん、昨日に引き続きありがとうございます。 おっしゃる通りプロジェクトの新規項目の追加でカスタムコントロールを作っていました。 通常のクラスを作りそちらにコードを書くことでエラーが無くなりました。 今回の現象についてまだ理解できていないのでまた調べてみます。 ありがとうございました。
ohno1011

2023/06/29 08:34

YAmaGNZさん、わざわざ解説までありがとうございます。 納得がいきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問