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

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

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

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

1147閲覧

C# BindingNavigator内のtoolStripButtonがControl c = this.ActiveControl;で受け取れない

AKITERU

総合スコア1

C#

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2022/12/25 09:16

編集2022/12/28 08:07

前提

MS SQL、Visual Studioで自分用住所録を作成中です。
フォームにテーブルCsKuwakeTblのcsKuwakeTblDataGridViewを作成し、自動的にcsKuwakeTblBindingNavigatorが作成されました。
ナビゲーター中に「toolStripButton1」を追加しました。又フォーム内に「button1」を追加。


DataGridViewのCellValidatingに下記のプログラムを書きましたが、フォームに作成した「button1」は認識しますがナビゲーター内の各種ボタン類はマウス左クリックしても全く無反応でCellValidatingに入ったら表示される先頭のメッセージも表示されません。


https://dobon.net/vb/dotnet/control/selectcontrol.html
「SplitContainerコントロール上のアクティブコントロールを取得できない問題」が関連するように思えるのですがプログラムを力不足で理解できません。

実現したいこと

CellValidatingをどのように変更すれば全てのボタン類をマウス左クリックした時その名前を受け取ることが出来るのでしょうか?ご教授ください

該当のソースコード

ソースコード C# private void csKuwakeTblDataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { MessageBox.Show("ヴァリデート イン"); Control c = this.ActiveControl; if (c != null) { MessageBox.Show("現在アクティブなコントロールは" + c.Name); } else { MessageBox.Show("現在アクティブなコントロールはありません。"); } }

####修正編集
回答者の皆さんへご指摘の点をお知らせるるのが遅れていることお詫びします。
どのページで指摘された点を投稿するのか方法が判らず、差し当たって今回の方法でお願しました。

(1)「何を何で作っているかを質問欄を編集して追記してください。」
環境はWindows 11 の Visual Studio 2022 で Windows Forms アプリをターゲットフレームワーク .NET Framework 4.8 です。

(2)テーブル及びlDataGridView
MS SQL ServerにCsPostDb.mdfを作成しここにCsKuwakeTb名のテーブルを作成しました。
Visual Studio 2022でCsPostDbDataSet名のデータセットを作成しこの中にCsKuwakeTbl名のDataTableが有ります。
尚CsKuwakeTbの定義は下の通りです。この名称の為投稿が固有名詞になっています。
CREATE TABLE [dbo].[CsKuwakeTbl] (
[KuwakeId] INT IDENTITY (1, 1) NOT NULL,
[KuwakeName] NVARCHAR (30) NOT NULL,
[HyoujiNo] INT NOT NULL,
CONSTRAINT [PK_CsKuwakeTbl] PRIMARY KEY CLUSTERED ([KuwakeId] ASC),
UNIQUE NONCLUSTERED ([KuwakeName] ASC)
);

(3)lDataGridViewの作成
Visual Studio 2022のデータソースウィンドウ内のCsKuwakeTblをフォームにドラッグ&ペーストしcsKuwakeTblDataGridViewを作成しました。Visual Studio 2022ではこの作業により自動的にcsKuwakeTblBindingNavigatorが作成されました。

(4)ボタン操作でやりたいこと
csKuwakeTblBindingNavigator内に新規作成したボタンはデータベースへの書き込み用としたい。
一方Form内のbutton1はアプリの終了ボタンとしたい。
グリッド内で既存データの編集又は削除、新規追加の作業をした場合csKuwakeTblBindingNavigator内のボタンをクリックしデータベースへの書き込み後でないとForm内のbutton1をクリックしてもグリッド内の現在の作業セルにフォーカスを戻したい。
又BindingNavigatorがクリックされたことを認識し、そのに続いてBindingNavigator内の構成要素のどれがクリックされたかを知る方法などは無いのでしょうか?


不明、不足点あればご指摘ください。理解できる範囲で追加します。よろしくお願いします。

################
####修正編集(2)
説明不足相済みません。フォローしていただいてありがとうございます。

(1)回答者の「意味不明」が判った様な気がします。ありがとうございました
(2)やりたかったのは下記の様なことでした
テーブルの項目には「必須入力」、「重複不可」等の条件が付いています。
この入力中の値をデータベース書き込み前にDataGridViewのCellValidatingで捕捉し、不適の場合作業中のセルにフォーカスを戻そうと考えました。
自分の書ているコードではグリッド内の行移動をしようとした場合はうまく動作したのですが、不正入力の時グリッド外のボタンをクリックすると下記のエラーメッセージが表示されます。
「DataGridviewで次の例外が発生しました。
SystemDataNotNullAllowedException列'KuwakeName'にnullsを使用することはできません」
これを防ぐためにグリッド外でクリックされたボタン類等が入手できれば対処かのかとおもいました。
(3)ご指摘から考えたこと
不正入力状態でボタンクリックすると例外が発生するのでこの例外を捕捉して対処すれば可能になるのではないか?
このようなことから回答者の方は「意味不明」を連発されたのではないか?
当面(2)のような考えでトライしてみます。ご指導ありがとうございました

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/12/25 10:41

> フォームにテーブルCsKuwakeTblのcsKuwakeTblDataGridViewを作成し、自動的にcsKuwakeTblBindingNavigatorが作成されました。 そういう固有名詞的な変数名を書かれても何のことか分かりません。自動的に BindingNavigator が作られると言われても何をしてそうなったのか分かりません。何も知らない第三者が読んでわかるように書けませんか?
退会済みユーザー

退会済みユーザー

2022/12/25 10:49

何を何で作っているかを質問欄を編集して追記してください。(例: Windows 10 の Visual Studio 2022 で Windows Forms アプリをターゲットフレームワーク .NET Framework 4.8 で作っています・・・とか) ターゲットフレームワークというのは、Visual Studio のソリューションエクスプローラーでプロジェクト名を右クリックして出てくるメニューでプロパティを選んで表示すると「対象のフレームワーク」という項目があるので、それを見てください。
KOZ6.0

2022/12/26 00:37 編集

BindingNavigator に追加したボタンはウインドウを持っていないので、クリックしてもフォーカスは移動しません。したがって DataGridView のイベントも発生しません。 ボタンを押したときに何をしたいのでしょうか?
退会済みユーザー

退会済みユーザー

2022/12/26 23:37

質問者さん、無言ですがギブアップして放棄ですか?
退会済みユーザー

退会済みユーザー

2022/12/28 02:41

> 一方Form内のbutton1はアプリの終了ボタンとしたい。グリッド内で既存データの編集又は削除、新規追加の作業をした場合csKuwakeTblBindingNavigator内のボタンをクリックしデータベースへの書き込み後でないとForm内のbutton1をクリックしてもグリッド内の現在の作業セルにフォーカスを戻したい。 意味が分かりません。「Form内のbutton1はアプリの終了ボタン」なのにクリックすると「作業セルにフォーカスを戻したい」とはどういうことですか? > 又BindingNavigatorがクリックされたことを認識し、そのに続いてBindingNavigator内の構成要素のどれがクリックされたかを知る方法などは無いのでしょうか? これも何をしたいのか分かりません。「どれがクリックされたかを知る」だけなら Click イベントにハンドラをアタッチしておけば、その引数の sender で分かりますがそれでは目的は果たせないのですか?
guest

回答1

0

ベストアンサー

質問のコメント欄の 2022/12/28 11:41 の私のコメントで書いたことが不明ですが、とりあえず回答しておきます。

以下の Microsoft ドキュメントに書いてあるように、データソース構成ウィザードを使って型付 DataSet / DataTable + DataAdapter + TableAdapterManager を作成し、そのドキュメントの 2 つ目の画像のようにして Windows Forms アプリを作ったのですね。

新しいデータ ソースの追加
https://learn.microsoft.com/ja-jp/visualstudio/data-tools/add-new-data-sources?view=vs-2022

そうすると以下のようなコードが自動生成されて、

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form18 : Form { public Form18() { InitializeComponent(); } private void tableBindingNavigatorSaveItem_Click(object sender, EventArgs e) { this.Validate(); this.tableBindingSource.EndEdit(); this.tableAdapterManager.UpdateAll(this.databaseDataSet); } private void Form18_Load(object sender, EventArgs e) { // TODO: このコード行はデータを 'databaseDataSet.Table' テーブルに読み込みます。 // 必要に応じて移動、または削除をしてください。 this.tableTableAdapter.Fill(this.databaseDataSet.Table); } } }

実行すると以下の画像のような結果になるはずです。

イメージ説明

csKuwakeTblBindingNavigator内に新規作成したボタンはデータベースへの書き込み用としたい。

上の画像で言うと、BindingNavibator 上の一番右側のフロッピーディスクのアイコンのボタンが「データベースへの書き込み用」として既に存在しているので新規作成の必要はないはずです。

そのボタンの Click イベントには上のコードで言うと tableBindingNavigatorSaveItem_Click がアタッチされています。それを見ればわかると思いますが、クリックすると Validate メソッドによって DataGridView の CellValidating イベントが発生し、その後 TableAdapterManager の UpdateAll メソッドで編集結果が DB に反映されます。

一方Form内のbutton1はアプリの終了ボタンとしたい。グリッド内で既存データの編集又は削除、新規追加の作業をした場合csKuwakeTblBindingNavigator内のボタンをクリックしデータベースへの書き込み後でないとForm内のbutton1をクリックしてもグリッド内の現在の作業セルにフォーカスを戻したい。

意味が分かりません。「Form内のbutton1はアプリの終了ボタン」なのにクリックすると「作業セルにフォーカスを戻したい」とはどういうことですか?

Button にフォーカスがあるときに Button をクリックすると DataGridView にフォーカスを移したいということなら、Button の Click イベントのハンドラで DataGridView に Focus メソッドを適用すれば良さそうですが?

又BindingNavigatorがクリックされたことを認識し、そのに続いてBindingNavigator内の構成要素のどれがクリックされたかを知る方法などは無いのでしょうか?

これも何をしたいのか分かりません。「どれがクリックされたかを知る」だけなら Click イベントにハンドラをアタッチしておけば、その引数の sender で分かりますがそれでは目的は果たせないのですか?

投稿2022/12/28 04:08

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

AKITERU

2022/12/28 08:17

ご指定いろいろありがとうございました。自分なりに「意味不明」が判った様な気がします。趨勢で記した様な考えでトライしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問