- 題名: DataGridの使い方
- 日時: 2006/02/19 0:01:20
- ID: 15110
- この記事の返信元:
- (なし)
- この記事への返信:
- [15130] Re[1]: DataGridの使い方2006/02/20 10:06:36
- ツリーを表示
> 早速、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なんかで検索されると良いと思います。
> 何マスの表を作られましたか? 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
分類:[.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では不可能であれば、進むべき道を提示して頂ければ幸いです。
よろしくお願いいたします。