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

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

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

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

Q&A

解決済

1回答

1621閲覧

【WinForm】DataGridViewのCellの値をコード上から変更すると新規行が表示されない

YanValCyn

総合スコア12

VB.NET

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

0グッド

0クリップ

投稿2021/04/23 02:02

編集2021/04/23 05:57

#はじめに
いつも大変お世話になっております。
色々調べてはみたのですが分からなかったため、質問させて頂きます。
どうぞ宜しくお願い致します。

#何をしようとしているか
受注伝票画面のような、

  • ヘッダー部:基本情報入力
  • 明細部:詳細情報入力
  • フッター部:ファンクションキー(登録、削除etc)

に分かれたWinFormを作成しています。

例(あくまでもイメージです)
![イメージ説明

(参照元:http://www.gyoumusoft.jp/column/hanbai/post-74/)

今回、こういった明細部をDataGridViewを用いて作成しようと考えています。
これにあたり、掲題の件で詰まってしまい、質問させて頂いた次第です。

#分からないこと
イメージ説明

上図のように、DataGridViewに型付きDataTableをバインドし、以下の構成としました。

  • コード入力部分
  • コード検索用のボタン(デザイナで追加)
  • コードに紐づく名称を表示する部分

ボタンを押したら(CellContentClickイベント)検索用画面を表示し、取得値をcodeとnameに入力するという動作を実現しようとしています。
望む動作としては、DataGridViewの通常動作(下図)のように、

イメージ説明

検索ボタンによって値を取得した後、自動的に次の行が出てくるようにしたいのですが、CellContentClickイベントで値を代入すると、下図のように次の行が表示されず、次の行が追加できない状態です。

イメージ説明

#やってみたこと
①DataTable.rows.add
→CellContentClickイベント内で、codeとnameに値をセットした後、addしてみましたが、NoNullAllowedExceptionが発生して落ちてしまいます。よく調べてみると、DataTableとDataGridViewのレコード数に1レコード分相違があり(dgvのほうが1多い)、dgvの列の編集がまだ確定していないことが分かりました。かといってどのように確定すれば良いのかも分からない状態です。

②DataGridView.rows.add
→エラー発生。バインドしているので出来ないようです。

#ソースコード

Public Class frmTestDrid '型付きデータテーブル Friend dt as new TestDataSet.TestDataTable Private Sub frmTestDrid_Load(sender As Object, e As EventArgs) Handles MyBase.Load DataGridView1.AutoGenerateColumns = False DataGridView1.DataSource = dt End Sub Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick Dim dgv As DataGridView = DirectCast(sender, DataGridView) If dgv.Columns(Button.Name).Name = Button.Name Then dgv.BeginEdit(True) '簡略化のため検索画面ではなく直接値を入れてあります dgv.Rows(dgv.CurrentCell.RowIndex).Cells(thisCode.Name).Value = 1 dgv.Rows(dgv.CurrentCell.RowIndex).Cells(thisName.Name).Value = "test" dgv.EndEdit() 'dt.Rows.Add() 'dgv.Rows.Add() End If End Sub End class

#動作環境
Visual Studio 2019

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

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

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

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

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

guest

回答1

0

ベストアンサー

今回、こういった明細部をDataGridViewを用いて作成しようと考えています。

質問の画像のような帳票アプリを DataGridView で作るのはまず無理だと思いますが、とりあえずそこは置いといて・・・

DataGridView のカラムに直接入力するのは考え直した方が良さそうです

多分、データは SQL Server などのデータベースに格納するのだろうと思いますが、そうであれば、

DataGridview ⇔ BindingSource / BindingNavigator ⇔ DataSet / DataTable ⇔ DataAdapter ⇔ SQL Server

という構造にするのがよさそうです。

以下の記事の図1と図2を見てください。時間が無ければ文章は読まなくてもいいので図だけ見てください。図だけ見ても理解できると思います。

DB 設計者のための明解 ADO.NET 第 1 回
https://docs.microsoft.com/ja-jp/previous-versions/cc482903(v=msdn.10)

DataGrisView は図2の DataSet の左側にある UI で、最初に DataSet に Fill されて DataGridView に表示されたデータを、ユーザーが DataGridView を見ながら編集し(編集結果は DataSet に反映される)、編集し終わったら Update で一気に編集結果を DB に反映するというように考えていろいろ作られており、それを支援するためのウィザードも Visual Studio には用意されています。

そのあたりは先のスレッド https://teratail.com/questions/329911 で参考になりそうな記事を紹介しました。それをもう一度見て考えてみてはいかがでしょう。

投稿2021/04/23 06:11

編集2021/04/23 06:16
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

YanValCyn

2021/04/23 07:10

SurferOnWww様 いつも大変お世話になっています。 先のスレッドで教えていただいた「Visual Studio のデータソース構成ウィザード」、バリバリ使わせて頂いています。 分からない部分もまだ多くありますが、開発が格段に楽になりました。 本当にありがとうございます。 今回もこちらを利用して作ろうとしたのですが、DataGridViewの動作で詰まってしまった次第です。 質問は簡略化のためと思い、この辺の説明はほとんど省いてしまっていました。 分からないなりに整理しているのですが、つまるところ、「DataGridViewはユーザインタフェースとして使う。プログラム上でデータ操作したい場合はDataTableを操作する。」といった認識で良いでしょうか…? > 質問の画像のような帳票アプリを DataGridView で作るのはまず無理だと思いますが、 実はそこのあたりも伺いたかった点なのです…。 おそらく質問の画像はGrapeCityのMultiRowだと思われますが、標準のコントロールを使うとなると何を使ったほうが良いのでしょうか…?
退会済みユーザー

退会済みユーザー

2021/04/23 07:45

> 「DataGridViewはユーザインタフェースとして使う。プログラム上でデータ操作したい場合はDataTableを操作する。」といった認識で良いでしょうか…? 自分はその認識です。少なくとも DB が絡むのであればですが。プログラムからですと BindingSource を操作する方法もあると思います。 表示するだけなので、それに型付 DataSet を作って使うのは重過ぎるということでも、DataGridView のセルの直接データを入れるより、例えば Linq to Entities などを利用して List<T> 型のデータソースを作って、それを BindingSource 経由で DataGridView にバインドした方が良さそうと思います。 > おそらく質問の画像はGrapeCityのMultiRowだと思われますが、標準のコントロールを使うとなると何を使ったほうが良いのでしょうか…? .NET Framework の標準のコントロールには質問の画像にあるような帳票が作れるものは、自分が知る限りですが、なさそうです。自分が知らないだけということかもしれませんので、そのあたりのことは仕様を明確にして別途質問された方が良さそうです。
YanValCyn

2021/04/23 07:53

大変参考になりました。 本件でもDBは絡みますので、DataGridViewはユーザインタフェースとして使う。プログラム上でデータ操作したい場合はDataTableを操作する。」といった認識でもう一度見直してみたいと思います。 また、「BindingSourceを操作する」については、自分で調べてみたいと思います。 >NET Framework の標準のコントロールには質問の画像にあるような帳票が作れるものは、自分が知る限りですが、なさそうです →だからこそ大体の会社はサードパーティ製の拡張コントロールを使っているわけですね。GrapeCityコントロールの導入も検討したいと思います。 大変助かりました。ありがとうございましたm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問