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

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

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

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

Visual Studio

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

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

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

Q&A

解決済

3回答

2685閲覧

VBとC#でのボタンイベントの違い

kumakumatan

総合スコア213

C#

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

Visual Studio

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

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

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

0グッド

0クリップ

投稿2021/12/24 05:13

編集2021/12/26 23:37

■WebForms
■OS:Windows7
■VisualStuido2017

ASP.netにてボタンクリック処理をVB.netとC#で記載しています。

vb

1Private Sub searchbtn_Click(sender As Object, e As EventArgs) Handles searchbtn.Click 2End Sub

ASP.NET

1<asp:Button ID="Searchbtn" runat="server" Text="サーチ" />

C#

1protected void Searchbtn_Click(object sender, EventArgs e) { 2}

ASP.NET

1<asp:Button ID="Searchbtn" runat="server" Text="サーチ" OnClick="Searchbtn_Click" />

vbの場合、OnClick="Searchbtn_Click"を記載しなくても良かったのですが、
C#だと記載しないとボタンクリック処理が動作しません。
C#では、aspx側に「OnClick="Searchbtn_Click"」の記述を記載しないと
クリックイベントは処理されないのでしょうか。
記載しなくてもいい場合、どのようにすれば良いか教えて下さい。

宜しくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/12/24 06:07

タグの ASP は Teratail ではクラシック ASP を意味します。ASP.NET に訂正してください。 何を作っているか(Web Forms? MVC? その他?)と開発環境(OS. Visual Studio のバージョンなど)ぐらいは書けませんか? > ボタンクリック処理をVB.netとC#で記載しています。 どういう意味? Web サイトプロジェクトであるページは VB.NET で、別のページは C# で書いているということ? Web アプリケーションプロジェクトでそんなことはできませんけど。
kumakumatan

2021/12/24 06:20

VB.NETで作成したものをC#で作り変える学習をしています。
kumakumatan

2021/12/24 06:24

はい。VBからC#への移行学習をしています。
退会済みユーザー

退会済みユーザー

2021/12/24 06:26 編集

イベントへのイベントハンドラのアタッチの仕方という同じこと質問なのだからスレッドを乱立しないでまとめてください。
退会済みユーザー

退会済みユーザー

2021/12/24 06:52

タグの ASP は Teratail ではクラシック ASP を意味します。ASP.NET に訂正してください。
退会済みユーザー

退会済みユーザー

2021/12/24 11:11

タグの ASP は Teratail ではクラシック ASP を意味します。ASP.NET に訂正してください。 これで 3 回目
guest

回答3

0

ベストアンサー

VBの方はHandles searchbtn.Click があるのでイベントの捕捉がてきています。
Handles句はVBだけの糖衣構文になります。
C#でaspx側に書きたくなければクラスのコンストラクタに追加してください。

C#

1searchbtn.Click += Searchbtn_Click;

これはVBでコンストラクタに

VB

1AddHandler searchbtn.Click, AddressOf searchbtn_Click

と書いたのと同じになります。
VBの方はHandles句がそれをやってくれているということです。
追記
コンストラクタでなくても実行時に一度だけ呼ばれる関数の中ならどこに書いてもだいたい問題ないです。
ただし、OnClick="Searchbtn_Click" と同じ動作を期待するなら関数の呼び出し順に注意が必要です。
ちなみに「一度だけ呼ばれる関数」と限定しているのは複数回イベントを追加すると追加した分だけイベントが処理されるためです。例えばVBでHandles searchbtn.Click, searchbtn.Click とすると2回イベントが処理されるようになります。
コンストラクタなら必ず一度だけ呼ばれるので都合がいいです。

投稿2021/12/24 05:59

編集2021/12/25 21:09
vann_2921

総合スコア190

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

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

kumakumatan

2021/12/24 06:16

ありがとうございます。 コンストラクタの部分ですが実際はどの部分に記載するのでしょうか。 namespace C_test { public partial class L1 : System.Web.UI.Page { } } namespace内、public partial class L1内に記載しても、エラーになってしまいます。 宜しくお願いします。
vann_2921

2021/12/24 06:35

コンストラクタは関数ですよ。 コンストラクタについて調べてください。 無いなら自分で書く必要があります。 VBの方だとイベントの追加と同じ要領でInitialize?かNew?があるので追加してください。そのコードを元にC#に書き直せばいいと思います。
kumakumatan

2021/12/24 06:36

protected void Page_Load(object sender, EventArgs e){ } 内に記載してできました。ありがとうございました。 今後とも宜しくお願いします。
kumakumatan

2021/12/24 06:55

public void InitializeComponent() //コンストラクタ { Searchbtn.Click += new EventHandler(Searchbtn_Click); } と作成して、 protected void Page_Load(object sender, EventArgs e){ InitializeComponent(); } にて呼び出してできるようになりました。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2021/12/24 23:01

> コンストラクタでなくても実行時に一度だけ呼ばれる関数の中ならどこに書いても大丈夫です。 「どこに書いても」というのは間違いです。タイミングの問題でイベントが発生したときハンドラがまだアタッチされてないということがあり得ます。 正解は .aspx ファイルのコードで質問者さんが書いたとおり、 <asp:Button ID="Searchbtn" runat="server" Text="サーチ" OnClick="Searchbtn_Click" /> です。
vann_2921

2021/12/25 05:13

そこを制御(いつからイベントの捕捉を始めるか)はプログラムを書く人が考えて下さい。 イベント追加する処理自体はどこに書いても正しく追加できます。
退会済みユーザー

退会済みユーザー

2021/12/25 05:56 編集

間違っているところ、 > コンストラクタでなくても実行時に一度だけ呼ばれる関数の中ならどこに書いても大丈夫です。 は直してください。(そもそもあなたが言う「コンストラクタ」というのが何だか不明ですがそこはとりあえず置いとくとして)
退会済みユーザー

退会済みユーザー

2021/12/27 01:07

上のコメントで、 > そもそもあなたが言う「コンストラクタ」というのが何だか不明ですがそこはとりあえず置いとくとして と書きましたが、そこを明確にしておきます。コメント欄では狭いし画像が貼れないので回答欄に書きます。
guest

0

vann_2921 さんの回答欄の下の 2021/12/27 10:07 の私のコメントで書いた件です。

vann_2921 さんの言う「コンストラクタ」というのが何だか不明ですが、もしそれが Page のコンストラクタのことだとするとそこでは設定できません。タイミングが早すぎます。

例えば、Button1 を Page に静的に配置して(デザイン画面でツールボックスから Page にドラッグ&ドロップして)、以下のように .aspx.cs で Page のコンストラクタで Button1.Click イベントにハンドラをアタッチしようとすると、

C#

1using System; 2 3namespace WebForms1 4{ 5 public partial class WebForm1 : System.Web.UI.Page 6 { 7 public WebForm1() 8 { 9 Button1.Click += Button1_Click; 10 } 11 12 private void Button1_Click(object sender, EventArgs e) 13 { 14 15 } 16 } 17}

コンストラクタに制御が飛ぶ時点では Button1 は存在しないので NullReferenceException がスローされます。

イメージ説明

Page のライフサイクルは以下の記事の通りで、ライフサイクルの各タイミングでその記事の Life-Cycle Events セクションに書いてあるイベントが発生します。

ASP.NET Page Life Cycle Overview (日本語版は無くなってました)
https://docs.microsoft.com/en-us/previous-versions/ms178472(v=vs.140)

どうしても Button1.Click += Button1_Click; でハンドラをアタッチしたいなら、それらのイベントのハンドラで可能ですが、タイミング的に全てのケースで問題ないか検証が必要です。質問者さんの回答の Load イベントのハンドラ Page_Load では遅い可能性があります。

なので、そんなことで悩むより、正解は .aspx ファイルのコードで質問者さんが書いたとおり、

<asp:Button ID="Searchbtn" runat="server" Text="サーチ" OnClick="Searchbtn_Click" />

とすることです。

投稿2021/12/27 01:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

public void InitializeComponent() //コンストラクタ
{
Searchbtn.Click += new EventHandler(Searchbtn_Click);
}
と作成して、
protected void Page_Load(object sender, EventArgs e){
InitializeComponent();
}
にて呼び出してできるようになりました。

投稿2021/12/24 07:34

kumakumatan

総合スコア213

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

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

退会済みユーザー

退会済みユーザー

2021/12/24 23:09

タイミングの問題でイベントが発生したときハンドラがまだアタッチされてないということがあり得ます。 Page_Load のタイミングで全てのケースで問題ないかは要検証。 なので、そんなことで悩むより、正解は .aspx ファイルのコードで質問者さんが書いたとおり、 <asp:Button ID="Searchbtn" runat="server" Text="サーチ" OnClick="Searchbtn_Click" /> とすることです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問