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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

2回答

1751閲覧

DataGridView の DataSource に DataTable を 割り当てた状態で DataTable に データを追加すると 最初だけ DataGridView が 2行追加される

kamikazelight

総合スコア305

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2019/03/15 08:30

編集2019/03/15 08:56

追記

新規作成用の行 は最初から表示されています。
その状態で一行追加すると
DataGridViewの行が 新規作成用の行 含め 3行になるのです。

1行 → 3行
最初
追加後

分からないこと

DataGridView の Datasource に DataTable を割り当てて使いたいのですが
DataGridView に 行がまだない空の DataTable を割り当てた 状態で
Datasource に行を追加すると
DataGridView に 2行追加されてしまいます。
一先ずDatasource の 割り当てを解除してから DataTable に 業を追加して
そのあと 再度割り当てれば そうならないことは分かったのですが

なぜ こんなことになってしまうのでしょうか?

該当のソースコード

pwoershell

1Using NameSpace System.Windows.Forms 2Using NameSpace System.Data 3 4$Form = [Form]::new() 5 6$View = [DataGridView]::new() 7 8$Data = [DataTable]::new() 9$Data.Columns.Add("tset") 10 11$View.DataSource = $Data 12$View.Name = "View" 13 14$Form.Controls.Add($View) 15 16$Form.Add_Click({ 17 [DataGridView] $View = $This.Controls["View"] 18 $View.DataSource = $null # データソース割当解除 ここをコメントアウトすると... 19 $Data.Rows.Add() 20 $View.DataSource = $Data 21}) 22 23$Form.ShowDialog()

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

powershell_ise 5.1
powershell 5.1 ()

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

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

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

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

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

guest

回答2

0

ベストアンサー

それは新規作成用の行です。
その行にデータを入力すると新しい行が作成される仕組みです。
これを作らないには、$View.AllowUserToAddRows = $False としてください。

追記

C#

1Using NameSpace System.Windows.Forms 2Using NameSpace System.Data 3 4$Form = [Form]::new() 5 6$View = [DataGridView]::new() 7 8$Data = [DataTable]::new() 9$Data.Columns.Add("tset") 10 11$BindingSource = [BindingSource]::new() 12$BindingSource.DataSource = $Data 13$View.DataSource = $BindingSource 14$View.Name = "View" 15 16$Form.Controls.Add($View) 17 18$Form.Add_Click({ 19 [DataGridView] $View = $This.Controls["View"] 20 #$View.DataSource = $null # データソース割当解除 ここをコメントアウトすると... 21 $BindingSource.CancelEdit() 22 $Data.Rows.Add() 23 $View.DataSource = $Data 24}) 25 26$Form.ShowDialog()

追記

BindingSource を使わないバージョン

C#

1Using NameSpace System.Windows.Forms 2Using NameSpace System.Data 3 4$Form = [Form]::new() 5 6$View = [DataGridView]::new() 7 8$Data = [DataTable]::new() 9$Data.Columns.Add("tset") 10 11$DataView = $Data.DefaultView 12$View.DataSource = $DataView 13$View.Name = "View" 14 15$Form.Controls.Add($View) 16 17$Form.Add_Click({ 18 [DataGridView] $View = $This.Controls["View"] 19 #$View.DataSource = $null # データソース割当解除 ここをコメントアウトすると... 20 $DataView.CancelEdit() 21 $Data.Rows.Add() 22 $View.DataSource = $Data 23}) 24 25$Form.ShowDialog()

投稿2019/03/15 08:38

編集2019/03/16 06:59
Zuishin

総合スコア28660

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

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

kamikazelight

2019/03/15 08:48

新規作成用の行は最初から表示されています。 その状態で追加すると 追加した行と 空の行と 追加用の行の 3行になるのです
kamikazelight

2019/03/15 08:50

該当のソースコードにある View.DataSource = $null # データソース割当解除 ここをコメントアウトすると... をコメントアウトして 実行して フォームをクリックしてみてください。
Zuishin

2019/03/15 09:18

新規作成用の行が確定しているからですね。 試しに $View.AllowUserToAddRows = $False としてみると、一行しか増えません。 また、二行増えた後、新規作成用の行をクリックして選択し、フォームをクリックするとやはり二行増えます。 この行がフォーカスされているときは、編集中という扱いになっているので、裏でデータを追加する前に確定されるのです。
Zuishin

2019/03/15 09:21

これを防ぐには、間に BindingSource を挟み、追加の前に CancelEdit() を呼ぶと一行だけ増えます。
Zuishin

2019/03/15 09:25

よく見ると DataGridView も CancelEdit メソッドを持っていたので、BindingSource を挟まなくても良いかもしれません。
kamikazelight

2019/03/15 09:25

BindingSource を挟み ってどういうことでしょうか?
kamikazelight

2019/03/15 09:26

すみません 追加コメントを見るのがずれました 理解できました
kamikazelight

2019/03/15 09:35

ごめんなさい $View.CancelEdit() をAddの直前に入れても ダメでした。 再現方法を教えてください。
Zuishin

2019/03/15 09:41

DataGridView の CancelEdit はこちらで試してみてもダメでした。 コードを追記しているので、こちらを試してみてください。
kamikazelight

2019/03/15 09:44

割り当てるソース を変えていたのですね..
Zuishin

2019/03/15 09:47

そうですね。DataGridView の DataSource に BindingSource を入れ、BindingSource の DataSource に DataTable を入れます。 これはコントロールとデータの間に入って IBindingListView を提供するものですから、データバインドを行う時にはとにかく入れておいた方がいいです。 C# のデザイナでバインディングを行うと BindingSource が自動的に追加されて間に入るようになっています。
Zuishin

2019/03/15 10:04 編集

えっと、誤解があるかもしれないと思ったので確認しておきますが、BindingSource は $Data に入っているデータを IBindingListView インターフェースを通して扱えるようにしてコントロールに渡すものです。 全然別のデータに切り替えているわけではないので。
kamikazelight

2019/03/16 06:07

BindingSource を使うことにあまり利点が感じられません...が とにかく入れておいた方がいい そうゆうものだと思うことにします。 理由も 編集中という扱いになっているので、裏でデータを追加する前に確定される というのはいいのですが 普通値を入力せずに確定しても 行が増えたりはしないのでピンときませんが DataGridView は Current行と 選択行が 別で存在しているようなので 内部で 新規で追加された行がの値が 新規行に入力された値と判断されてるのかもしれないですね ありがとうございました。
Zuishin

2019/03/16 07:03

BindingSource を使わないバージョンを追記しました。 代わりに DefaultView を使います。 新規行は確定時に追加されるのではなく、すでに追加されています。 編集がキャンセルされた時に削除される仕組みです。 データソースが変更された場合は編集がキャンセルされず確定されるのでこのようになります。 ですからその前にキャンセルする必要があるのです。
Zuishin

2019/03/16 07:06

この DefaultView ですが、実は DataGridView.DataSource に DataTable を直接入れた場合も作られます。DataGridView と DataTable が直接バインドされるのではなく、DataTable の実装する IListSource を通じて取得される DefaultView が DataGridView とバインドされる仕組みです。 ですからこの追記のコードは、本来ユーザーコード中には表れない DefaultView をフックするものです。
kamikazelight

2019/03/16 08:05

> 編集がキャンセルされた時に削除される仕組みです そういうことでしたか 分かりやすい説明のおかげで 納得できました。 DefaultView? を 使う方法まで 教えて頂き とても助かりました。 それほどの利点が見いだせない未知のものを追加するのは とても 心理的抵抗感があったので葛藤していました。 今回もありがとうございました。 また宜しくお願いします。
guest

0

なぜ こんなことになってしまうのでしょうか?

データ入力用の新規行が追加されているからです。
恐らくユーザー入力できるDataGridViewを作りたい人向けの仕様でしょう。

新規行の追加を無効にしたい場合はAllowUserToAddRowsfalseにしてください。

投稿2019/03/15 08:37

編集2019/03/15 08:38
BluOxy

総合スコア2663

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

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

kamikazelight

2019/03/15 08:48 編集

データ入力用の新規行は最初から表示されています。 その状態で追加すると 追加した行と 空の行と 追加用の行の 3行になるのです
kamikazelight

2019/03/15 08:50

該当のソースコードにある View.DataSource = $null # データソース割当解除 ここをコメントアウトすると... をコメントアウトして 実行して フォームをクリックしてみてください。
BluOxy

2019/03/15 09:05 編集

細かい話は分からないのですが、DataTableの行数とDataGridViewの行数に差異がある状態でDataSourceをセットしているのならこちらの事象と似ている気がします。 http://blog.syo-ko.com/?eid=2394
kamikazelight

2019/03/15 09:06

ありがとうございます。 直ぐ確認します。
kamikazelight

2019/03/15 09:40 編集

DataTableの行数とDataGridViewの行数に差異というのは 違う気がします。 もしそのようなものがあれば 行数の違うDataTableのセットが出来なくなってしまうと思うのですが 頂いたURLの解決策も 行をそろえるのではなく 単純に新規追加行にデータを入れていました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問