DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridの使い方

  • 題名: DataGridの使い方
  • 著者: gop0080
  • 日時: 2006/02/19 0:01:20
  • ID: 15110
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[WinXP, VC#.NET2005]
分類:[.NET]

どうも、いつも拝見させて頂いております。
この度、下記のようなWinアプリを作ろうと思っているのですが、
実現方法がわかりませんので、皆さんのお知識を拝借できればと
思っております。

・例えば、ホテルやカラオケボックスのような有限個の客室を
 DataGridまたはDataGridViewを使ってフォーム上に表示したい。
 5×5=25室など、固定で。

・汎用性を持たせるため、AccessまたはSQLServerから客室データを
 取得し、表示させたい。
 データのX座標・Y座標を読み、フォーム上のDataGridの座標の
 対応する位置へRoomNo. を表示させたい。
 読み込むデータは以下のような感じ。
   ID RoomNo. X  Y
  ---------------------
   01  101   0  0
   02  102   0  1
   03  103   0  2
   |    |     |   |
   20  505   5  3

・一覧表示させた客室をダブルクリックするなどのイベントが
 発生した際、例えば明細入力フォームなどを立ち上げたい。
 これはHitTestメソッドを使えばいいんでしょうか。


のような感じです。上記のようなことは実現可能でしょうか?
もし、サーバから座標データを取得して表示させる方法が出来ない、
またはパフォーマンスが悪いのであれば、アプリ側でデータを
決めてしまってもいいのですが。
それとも、そもそもDataGridではなく他の方法で実装したほうが
よいのでしょうか。

環境およびスキル:
現在、VisualC#2005 ExpressEdition にて暫定的にコーディングを
行っておりますが、近いうちにパッケージを購入予定(Proがほしい
ですが、小遣いの都合上Stdになると思います)です。
また、私自身のプログラミング経験は、10年以上前に「C言語」のみで
オブジェクト指向は初挑戦です。プロではありません。
独習で試行錯誤しながらやっておりますが、実現可能ということで
あれば、勉強しながらやってみようと思います。
DataGridでは不可能であれば、進むべき道を提示して頂ければ幸いです。
よろしくお願いいたします。
実現は可能だと思います。
VCは使った事が無いので良くわかりませんが、VBならできると思います。
VBが出来るなら、VCも出来るとは思いますけど。

gop0080さんの仰るとおり、HitTestで実現が可能だと思います。
あとは、ダブルクリックのイベントで明細入力フォームを表示すればOKかと

試してないですが、gop0080さんの考えている通りに実装すれば大丈夫なはずです
やってできなくはないと思いますが、もう少し具体的にデータ構造を考えて、どのように表示してどのようにデータの追加変更削除を行うかを、具体的に考えたほうが良いのではないかと思います。具体的には、空き室状況となると、日付の概念がありますし、同時にデータの更新がかかるなら同時実行のこともあります。この辺りは大丈夫でしょうか?
Mateさん、trapemiyaさん、レスありがとうございます。

確かに、データ構造についてはもう少し吟味が必要かと考えております。
ただ今回のケースでは、データベースから取得するデータの特徴としては
・表示させる部屋番号と表示位置
・部屋は増改築を行わない限りは固定でOK。
という感じです。

伝票入力、顧客管理、日次更新等も併せて考えておりますが、現段階では
別データでと考えております。
先述の部屋のデータは、他のマスタ設定(商品明細コード、税区分などの
テーブルを作成)と併せて、一度決めてしまえば読み込むだけのデータに
しようかと考えております。もちろんアプリ側からマスタ設定を行えるように
するつもりではありますが。

ただ、DataGridまたはDataGridViewの指定座標へ、先述の座標データを
読み込んで表示できるかどうかが心配だったので。
もしかして、DataGridを使わずもっと効率的な別のアプローチがあるかなと
思いまして。

実は、単純にボタンを部屋数分だけ用意してクリックさせる…みたいな
ことも考えてみましたが、やはりセルで一覧表示できて、チェックイン
してる部屋は色を変えて…というように実現したかったもので。

データベース上の部屋の座標情報を読み込み、DataGrid上に部屋番号を
表示させる…具体的にはどのようにコーディングすればいいんでしょうか。
もしアイディアがありましたらご教示頂ければ幸いです。

乱筆をお許しください。m(_ _)m

追伸:
VS2005パッケージの購入を検討しております。Stdエディションには
CrystalReportがついてないようですが、SQL Reporting Service で
同様なレポート作成が可能なのでしょうか?
併せて帳票の印刷も考えております。
日にち管理等は了解しました。当方の思い過ごしだったようです。すみません。

> ただ、DataGridまたはDataGridViewの指定座標へ、先述の座標データを
> 読み込んで表示できるかどうかが心配だったので。

例えば、DataGridView[3, 10].Value = 5; のような感じで値を設定できます。
背景色だと、DataGridView[3, 10].Style.BackColorにセットできます。
DataGridViewのどこがクリックされたかはHitTestでいけます。

> もしかして、DataGridを使わずもっと効率的な別のアプローチがあるかなと
> 思いまして。

たぶん、私なら最初に試みるのはユーザーコントロールの作成だと思います。ユーザーコントロールでの表現はGDI+を使って描くと思います。
使い回しがききますし、何かと要望が出たときに融通がききそうですしね。
でも、25個ぐらいなら、ラベルを貼り付けてもいいかな?
単なる私の思いつきですが(^^;
度々のレスありがとうございます。

> 例えば、DataGridView[3, 10].Value = 5; のような感じで値を設定できます。
> 背景色だと、DataGridView[3, 10].Style.BackColorにセットできます。

早速、trapemiyaさんの言われたようにやってみましたが、
例外ArgumentOutOfRangeExceptionが投げられてしまいます。
単純に「DataGridView[3, 10].Value = 5; 」の編集記述だけなのですが。
何故でしょう。単純にセル内に表示したいだけなのに… (T_T)
根本を理解していないかもしれませんが、心当たりがありましたら
ご教示頂ければ幸いです。

あと、このセル表示を実現させるのに、空のデータベース(5*5=25)を
読み込ませているのですが、アプリ内でこの「器」を用意してあげることは
できるでしょうか? 非バインドというのがそうだと思うのですが、行を
追加できません。質問はこれを最後にしようかと思います。何卒お力を
お貸しください。


> DataGridViewのどこがクリックされたかはHitTestでいけます。

ありがとうございます。
勉強しながら少しずつやっていきます。


>>もしかして、DataGridを使わずもっと効率的な別のアプローチがあるかなと
>>思いまして。
>
> たぶん、私なら最初に試みるのはユーザーコントロールの作成だと思います。ユーザーコントロールでの表現はGDI+を使って描くと思います。
> 使い回しがききますし、何かと要望が出たときに融通がききそうですしね。

全くわかりませんので、この方法はパスさせていただきます。
アイディアを頂いたのに却下で申し訳ないです。m(_ _)m


> でも、25個ぐらいなら、ラベルを貼り付けてもいいかな?
> 単なる私の思いつきですが(^^;

やはり私のスキルでは、これが一番妥当な方法かもしれませんね。(汗
> 早速、trapemiyaさんの言われたようにやってみましたが、
> 例外ArgumentOutOfRangeExceptionが投げられてしまいます。
> 単純に「DataGridView[3, 10].Value = 5; 」の編集記述だけなのですが。
> 何故でしょう。単純にセル内に表示したいだけなのに… (T_T)

何マスの表を作られましたか? 5 x 5 = 25の表でしたら、インデックスは
縦横それぞれ0〜4までしかありません。
つまり、DataGridView[0, 0]からDataGridView[4, 4]までしか指定できません。
その状態でDataGridView[3, 10]の位置のセルを参照しようとしても、欄外
(OutOfRange)になってしまいます。

> あと、このセル表示を実現させるのに、空のデータベース(5*5=25)を
> 読み込ませているのですが、アプリ内でこの「器」を用意してあげることは
> できるでしょうか? 非バインドというのがそうだと思うのですが、行を
> 追加できません。

例えば、以下の感じで、3列20行の表が作成できます。

dataGridView1.Columns.Add("room", "room");
dataGridView1.Columns[0].Width = 50;
dataGridView1.Columns.Add("total", "total");
dataGridView1.Columns[1].Width = 50;
dataGridView1.Columns.Add("vacant", "vacant");
dataGridView1.Columns[2].Width = 50;

dataGridView1.Rows.Add(20);

> 質問はこれを最後にしようかと思います。何卒お力を
> お貸しください。

最後でなくて全然かまいません。よければまた質問してください。
ただし、私がいつもすぐに返答できるとは限りません。
でも、他の誰かがきっと返答してくれると思います。

>>DataGridViewのどこがクリックされたかはHitTestでいけます。
> 
> ありがとうございます。
> 勉強しながら少しずつやっていきます。

MSDN2まるコピーに近いですが、(^^;

/// <summary>
/// 右クリックした位置のセルのバックカラーをGreenに変える。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        DataGridView.HitTestInfo hit = dataGridView1.HitTest(e.X, e.Y);
        if (hit.Type == DataGridViewHitTestType.Cell)
        {
            dataGridView1.Rows[hit.RowIndex].Cells[hit.ColumnIndex].Style.BackColor = Color.Green;
        }
    }
}

> 全くわかりませんので、この方法はパスさせていただきます。
> アイディアを頂いたのに却下で申し訳ないです。m(_ _)m

いえいえ。
ちなみにこの方法は、自分で線を引いたり文字を書いたりして表を作るイメージです。
将来やってみたくなりましたら、GDI+とかCreateGraphicsなんかで検索されると良いと思います。
  • 題名: Re[7]: DataGridの使い方
  • 著者: gop0080
  • 日時: 2006/02/21 20:17:48
  • ID: 15181
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
> 何マスの表を作られましたか? 5 x 5 = 25の表でしたら、インデックスは
> 縦横それぞれ0〜4までしかありません。
> つまり、DataGridView[0, 0]からDataGridView[4, 4]までしか指定できません。
> その状態でDataGridView[3, 10]の位置のセルを参照しようとしても、欄外
> (OutOfRange)になってしまいます。

う〜ん、さすがにそれくらいはわかるのですが… ^^;
[0,0]とかにしてもダメでした。読み込んだ空DB(Access)の設定が
よくなかったのかもしれませんね。


> 例えば、以下の感じで、3列20行の表が作成できます。
> 
> dataGridView1.Columns.Add("room", "room");
> dataGridView1.Columns[0].Width = 50;
> dataGridView1.Columns.Add("total", "total");
> dataGridView1.Columns[1].Width = 50;
> dataGridView1.Columns.Add("vacant", "vacant");
> dataGridView1.Columns[2].Width = 50;
> 
> dataGridView1.Rows.Add(20);

仰る通りにしたら出来ました。ありがとうございます。
また、上述の「DataGridView[3, 10].Value = 5; 」も今回は
できました。前回、なぜ例外が投げられたのかは謎ですが。
でも、これで一つフォームのメドがつきました。


> > 質問はこれを最後にしようかと思います。何卒お力を
> > お貸しください。
> 
> 最後でなくて全然かまいません。よければまた質問してください。
> ただし、私がいつもすぐに返答できるとは限りません。
> でも、他の誰かがきっと返答してくれると思います。

やさしいお言葉をありがとうございます。
また行き詰ったら、寄らせて頂きます。m(_ _)m


> >>DataGridViewのどこがクリックされたかはHitTestでいけます。
> > 
> > ありがとうございます。
> > 勉強しながら少しずつやっていきます。
> 
> MSDN2まるコピーに近いですが、(^^;
> 
> /// <summary>
> /// 右クリックした位置のセルのバックカラーをGreenに変える。
> /// </summary>
> /// <param name="sender"></param>
> /// <param name="e"></param>
> private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
> {
>     if (e.Button == MouseButtons.Right)
>     {
>         DataGridView.HitTestInfo hit = dataGridView1.HitTest(e.X, e.Y);
>         if (hit.Type == DataGridViewHitTestType.Cell)
>         {
>             dataGridView1.Rows[hit.RowIndex].Cells[hit.ColumnIndex].Style.BackColor = Color.Green;
>         }
>     }
> }

なるほど。
完全にはコードの意味が理解できませんが、使い方がわかりました。
頂いたコードを参考に、いろいろいじってみます。


> > 全くわかりませんので、この方法はパスさせていただきます。
> > アイディアを頂いたのに却下で申し訳ないです。m(_ _)m
> 
> いえいえ。
> ちなみにこの方法は、自分で線を引いたり文字を書いたりして表を作るイメージです。> 将来やってみたくなりましたら、GDI+とかCreateGraphicsなんかで検索されると良いと思います。

了解しました。
本職とは別に片手間でやっておりますので、そこまでスキルアップできるか
わかりませんが、チャレンジするときにはまたこの掲示板に現れると思いますので
その節にはよろしくお願い致します。やっとオブジェクト指向の概念がわかりかけて
きた段階ではありますが…^^;

度々の初歩的な質問に懇切丁寧に答えて頂き、ありがとうございました。m(_ _)m
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板