一回も披露したことのない豆知識

.NETでWinFormアプリをC#で製作中です。
Visual Studio Community 2017を使用しています。

添付の図のようにDataGridViewコントロールに、DataTableをバインドして表示させています。
私が今やりたいのは「新しく行を追加したらその行を選択状態にしたい」というものです。

添付の図は「点数」列ヘッダーをクリックして昇順ソート状態になっています。
この状態で新しく行を追加すると、表示上ソートが反映された状態で適切な追加に行が追加されるため、一瞬どこに追加されたのか分かりません。なので選択状態にしたいのです。

しかし、その方法を検索して調べてはみましたが、うまく見つけることができませんでした。

自分で考えてみたのは
① DataTableに登録した順に0から番号を割り振っていく "No" という名前の列を用意
② 新しく列を追加したら RowsCount() で列数をカウント
③ カウントした番号を ”No” 列の値に設定
④ "No" 列がその値の行を選択する
‥という感じならいけるのかな?と考えてみました。

しかし具体的な記述が分かりません。

例えばこちらのように入力しても、この場合はただ最後の行が選択されるだけです。
int i = RowsCount();
dgv.Rows[i].Selected = true;
(ちなみにSelectedよりもCurrentの方が良いのでしょうか?)

「DataTableに最後に追加した行をDataGridView上で選択する」にはどう記述すれば良いのでしょうか?

お分かりになる方いらっしゃいましたら、ぜひアドバイスをお願いします。m(_ _)m

「C# DataTableに最後に追加した」の質問画像

A 回答 (2件)

>>しかし新たに追加した列のユニークな値を見つけたとして、その行を選択する方法がなかなか見つからず‥



データにユニークな値があれば、Grid内のデータをサーチして、見つかった行に対して、Selected = tureを設定すればいいだけでしょう。

>>特にVisual Studioのデザイナを使ってDataSet、DataTableを作成してDataGridViewにバインドした場合でどう記述したら良いのかで詰まっています。。

まあ、私も昔、このあたりの処理が参考になる情報をネットで探したのですが、よい情報をみつけることができませんでした。
それで、以下の書籍を購入して勉強しました。

・C#によるコンポーネントプログラム 瀬尾佳孝  オーム社 2,800円
・プログラミングADO.NET 2.0 マイクロソフト公式解説書 日経BP 8,500円

特に後者のマニュアルは、大いに参考になりました。高い分厚い本は、値段に比例して役だち度が上がるようです。

>>FormアプリでDataGridViewを使ったデータベース入門みたいな本があれば喜んで飛び付くのですが。。

それは、後者の書籍が役にたちますが、前者の書籍でも、そういう目的に沿った内容だと思います。
ただし、前者の発行年は平成15年と、15年くらいも前の書籍です。
後者も発行年をみると、2007年で10年以上前・・・。

最近のEntityFrameworkじゃあなく、DataTableやDataAdapterを使ってデータ処理を行っているので、現時点からみたら悲しいですね。

>>しかし、今やりたいことに到達するまでにこれらを学んでいけば到達するのか、それはどの段階で到達するのか‥が分からずもやもやしています(^^

確かに、そういうことを独学で学ぶのは難しいですね。
私の場合は、派遣プログラマをやっているので、実際に使われている業務アプリのソースに使われているテクニックから学んだりしています。
ただ、最近の仕事で扱うC#のアプリはデスクトップじゃあなく、ASP.NET MVCなど、Web系のHTMLやJavaScript等を使ったものばかりみたいです。
そして、Web系の開発経験が少ない私は、知らないことが多くて、泥縄的ですが、仕事しながら、参考となる本買って勉強して、なんとか追いついているって感じです。

>>今の目的としてはちょっとしたDataGridViewを使ったアプリを作りたいだけなので、DataGridViewやDataTable周りのプロパティやメソッドをひたすら調べていった方が速いのでしょうか。。

振り返ってみれば、私が実際にDataGridViewを使ってアプリを作った時、用意されているDataGridViewの機能だけでは足りなくて、DataGridViewの長いソースコードを追いかけて、どうすれば欲しい機能が追加できるのか?ってのを調べたものでした。

DataGridViewを使う場合、なかなか欲しい機能が無いってことも多いんですよね。
だから、企業は速く開発を進めるため、高価なグレープシティのGirdViewを購入してアプリ開発を行うことが多いみたいです。
だから、独力でやっていたら、そんなに速い開発はできないと思います。
ただ、現在のDataGridViewなら、もっと使いやすくなっているのかもしれません。


ちなみに、最近はコンピュータ関連の日本語翻訳書籍はあまり売れないそうです。
それに比例して、ネット上の日本語ドキュメントもいまいち状態だったりします。

最新技術を仕入れたければ、本家マイクロソフトの英文ドキュメントを読むのが一番正確で、分りやすい状況なのかもしれません。
私は、ASP.NET MVCについては、ネットで日本語の情報を読んでも、よくわからないので、マイクロソフトの英文ドキュメント読んで学びました。
    • good
    • 0
この回答へのお礼

>データにユニークな値があれば、Grid内のデータをサーチして、見つかった行に対して、Selected = tureを設定すればいいだけでしょう。

あ、DataTableの値にこだわらなくともDataGridViewの値を探すのでいけますね‥
下記のように記述してやりたいことができました!

// 追加した行を選択する
for (int i = 0; i < count; i++) // No列の値を先頭行から順に検索
{
string s = this.dgv.Rows[i].Cells[0].Value.ToString();
int iResult = int.Parse(s);

if (count == iResult)
{
dgv.Rows[i].Selected = true;
}
}

>ただ、最近の仕事で扱うC#のアプリはデスクトップじゃあなく、ASP.NET MVCなど、Web系のHTMLやJavaScript等を使ったものばかりみたいです。

ふむむ、そうなのですね。
確かに私も業務ではスタンドアローンのアプリよりもウェブベースのものを使うことが多いです。

>ただし、前者の発行年は平成15年と、15年くらいも前の書籍です。
>後者も発行年をみると、2007年で10年以上前・・・。

WindowsFormも、それでこそLINQなんかもなんだかんだで結構年数が経つみたいですね。。
しかし今やっていることにピタリとマッチしている感じですので、チェックしたいと思います!

>DataGridViewを使う場合、なかなか欲しい機能が無いってことも多いんですよね。

Formのコントロールでやりたいと思ったら標準機能として用意されていなことが多いですが、WPFに手を出してみようとして「これは厳しい」と思ってすぐまたFormに戻りました。。

>最新技術を仕入れたければ、本家マイクロソフトの英文ドキュメントを読むのが一番正確で、分りやすい状況なのかもしれません。

ググると Stack Overflow という海外サイトがよく引っ掛かりますが、海外の方が質問や議論も多そうですね。英語は苦手ですが、そのあたりも克服していきたいところです。

色々と参考になります。 ありがとうございました!

お礼日時:2018/10/07 00:43

なかなか苦労されているようですね。



まず理解すべきことは、DataTableはリレーショナル・データベース(以下RDB)のテーブルを扱うために作られたと思っています。
そしてテーブル設計時には、必ずユニーク・キーを割り当てておきます。
つまり、テーブルに含まれるデータは、運転免許証の番号やクレジットカードの番号のような、目的のデータを特定できる番号かIDを持たせておく必要があるのです。
そうしてあれば、新しく追加したデータがどれであったか、追加した時点でユニーク・キーを覚えておけば、そのデータが画面に表示されたとき、並べ替えられたとしても、そのデータを特定して、選択状態にできます。

ただ、この画面のデータ例では、田中さんに個人IDを001、鈴木さんに002などを振っても、教科ごとのデータがあるため、ユニーク・キーにはなりません。
この場合、データ登録を行ったとき、ユニークとなるように、

1)採番用のデータを他のテーブルに用意する
2)RDBの自動採番機能を利用する
3)国語に1、社会に2などの識別番号を割り当て、個人IDとつないで、ユニークになるようにする(複合キーの利用)

といった方法があります。
なお、RDBの自動採番機能を利用する場合には、新しくデータを追加する時点では、そのデータに何番が割り当てられるかは分かりません。
追加したデータに何番が割り当てられたか知るには、RDB固有の命令を使うことになるので、ちょっと難易度が上がったりします。

ちなみに、昔は、C#でDataTableを利用してDataGridViewを使うことが多かったと思います。
でも、マイクロソフトがEntityFrameworkやLinqという機能をRDBで使えるようにC#の仕様をバージョンアップ時に変更しました。
これらを使うと、DataTableを使うことは無くなって、しかもデータ処理が楽ちんになります。

ただし、EntityFrameworkやLinqがどんなものか?それをどう使えばいいのか?といったことを学ばないといけません。
もちろん、それ以前に「RDBとはどんなものか?それを使うには、どうすればいいか?テーブル設計はどうすべきか・・・」

などなど、楽をするためには、それ以前に沢山のことを学ぶ必要があったりするので、例にあるデータを処理するだけだと、「牛刀をもって鶏を割く」のような感じになる気がちょっとしますけどね。
    • good
    • 0
この回答へのお礼

lv4uさん
とても丁寧にアドバイスいただいてありがとうございます!

なるほど、分かりやすい例えでしたので考え方としてはとても理解できました。
丁度私が頭の中で考えたこちらも‥
 >① DataTableに登録した順に0から番号を割り振っていく "No" という名前の列を用意
 >② 新しく列を追加したら RowsCount() で列数をカウント
 >③ カウントした番号を ”No” 列の値に設定
 >④ "No" 列がその値の行を選択する
「列を新たに追加してユニークな値を設定すれば良いのでは?」と考えたので、考え方は間違っていなかったのですね。

しかし新たに追加した列のユニークな値を見つけたとして、その行を選択する方法がなかなか見つからず‥
特にVisual Studioのデザイナを使ってDataSet、DataTableを作成してDataGridViewにバインドした場合でどう記述したら良いのかで詰まっています。。
フィルタ表示は「DataTableBindingSource.Filter = "列名 = 'A'";」のような感じでフィルタできることが先ほどようやく分かってぐったりしているところです。
趣味の独学でやっているのでなかなかキツイですね。
FormアプリでDataGridViewを使ったデータベース入門みたいな本があれば喜んで飛び付くのですが。。

それでも、最新はデータベースの基礎知識を学び始め、LINQを使ったソートやフィルタ、その際の記述を理解するためのラムダ式やデリゲートを少しずつ調べて覚えようとしているところです。
しかし、今やりたいことに到達するまでにこれらを学んでいけば到達するのか、それはどの段階で到達するのか‥が分からずもやもやしています(^^A
今の目的としてはちょっとしたDataGridViewを使ったアプリを作りたいだけなので、DataGridViewやDataTable周りのプロパティやメソッドをひたすら調べていった方が速いのでしょうか。。

お礼日時:2018/10/06 19:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A