C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

クラスからDataGridViewへの数値代入

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■92870 / inTopicNo.1)  クラスからDataGridViewへの数値代入
  
□投稿者/ protect (1回)-(2019/11/04(Mon) 20:08:16)

分類:[C#] 

お世話になります。

メインFormに貼り付けたDataGridViewへ他のフォームやクラスから
値を代入すると下記のエラーが出てしまいます。
"System.ArgumentOutOfRangeException: 'インデックスが範囲を超えています。
負でない値で、コレクションのサイズよりも小さくなければなりません。"

Formのインスタンスは操作側のクラスもしくは別のForm側で生成しております。

Form1 fm = new Form1();
fm.DataGrid[0, 0].Value = 10;  <-エラーになる。

因みにですが、メインFormがロードされる時に
DataGridを初期化しております。

private void Form1_Load(object sender, EventArgs e)
{
DataGridIni(5);
}

private void DataGridIni(int iCol)
{

DataGrid.ColumnCount = iCol;
DataGrid.Columns[0].HeaderText = "A";
DataGrid.Columns[1].HeaderText = "B";
DataGrid.Columns[2].HeaderText = "C";
DataGrid.Columns[3].HeaderText = "D";
DataGrid.Columns[4].HeaderText = "E";

//行列更新
for (int iRow = 0; iRow < MAXBUF + 1; iRow++) { DataGrid.Rows.Add(""); }

}

対処方法を教えていただけないでしょうか
引用返信 編集キー/
■92872 / inTopicNo.2)  Re[1]: クラスからDataGridViewへの数値代入
□投稿者/ Azulean (1097回)-(2019/11/04(Mon) 20:57:53)
2019/11/04(Mon) 20:59:04 編集(投稿者)

No92870 (protect さん) に返信
> Form1 fm = new Form1();
> fm.DataGrid[0, 0].Value = 10;  <-エラーになる。

Load イベントは「フォームが表示されようとするときに呼び出されるイベント」です。
new するだけでは表示されようとしていないので、Load イベントは実行されていません。
new したときに処理を実行させたいなら、コンストラクタ(public Form1() のこと)内に処理を書いてください。


そういった動きを確認する意味でも、「ブレークポイント」を使ったデバッグを学びましょう。
通常だと F9 キーでブレークポイントの設定と解除ができ、F5 キーで実行するとそのブレークポイントの位置で実行が止まります。

(検証していないのでほかにも原因があるかもしれませんが、ぱっと見て気づくことだけをひとまずコメントしました)
引用返信 編集キー/
■92874 / inTopicNo.3)  Re[2]: クラスからDataGridViewへの数値代入
□投稿者/ protect (2回)-(2019/11/04(Mon) 21:08:01)
申し訳ございません
情報不足でした
補足させていただきます

Form1 fm = new Form1();
fm.DataGrid[0, 0].Value = 10;

の部分は別のフォーム(例えばForm2)に記載しているコードになります。

Form1側にボタンがあり、押されることでForm2が呼び出され
そこでForm1のインスタンスが生成されるプログラムになっております。
そして、Form2が呼び出されたとき、Form1にあるDataGridViewに値を代入する
ことになります。

フローとしましては
Form1 loadイベント→DataGridView初期化→操作する側がForm1のボタンを押す→
Form2が呼び出される→Fomr2のメソッドがForm1のDataGridViewのあるセルに値を代入する
になります。

No92872 (Azulean さん) に返信
> 2019/11/04(Mon) 20:59:04 編集(投稿者)
>
> ■No92870 (protect さん) に返信
>>Form1 fm = new Form1();
>>fm.DataGrid[0, 0].Value = 10;  <-エラーになる。
>
> Load イベントは「フォームが表示されようとするときに呼び出されるイベント」です。
> new するだけでは表示されようとしていないので、Load イベントは実行されていません。
> new したときに処理を実行させたいなら、コンストラクタ(public Form1() のこと)内に処理を書いてください。
>
>
> そういった動きを確認する意味でも、「ブレークポイント」を使ったデバッグを学びましょう。
> 通常だと F9 キーでブレークポイントの設定と解除ができ、F5 キーで実行するとそのブレークポイントの位置で実行が止まります。
>
> (検証していないのでほかにも原因があるかもしれませんが、ぱっと見て気づくことだけをひとまずコメントしました)
引用返信 編集キー/
■92875 / inTopicNo.4)  Re[3]: クラスからDataGridViewへの数値代入
□投稿者/ Azulean (1099回)-(2019/11/04(Mon) 21:25:26)
2019/11/04(Mon) 21:29:52 編集(投稿者)

No92874 (protect さん) に返信
> フローとしましては
> Form1 loadイベント→DataGridView初期化→操作する側がForm1のボタンを押す→
> Form2が呼び出される→Fomr2のメソッドがForm1のDataGridViewのあるセルに値を代入する
> になります。

そのフローの認識に間違いがあります。
その文面を借りて、箇条書きに分けながら、「」つきで大事な部分を書き加えてみます。

1.Form1 loadイベント
2.DataGridView初期化
3.操作する側がForm1のボタンを押す
4.Form2が呼び出される
5.Fomr2のメソッドが 「新しい」Form1 を生成する
6.「新しい」Form1 のDataGridViewのあるセルに値を代入する

「new」と書いたら「新しい別のものを作る」ことを意味します。
すでに存在する Form1 自体を操作したいのであれば、new してはなりません。
すでに生成済みの Form1 のインスタンスを Form2 が受け取る必要があります。

(最近だと No92805 でも同じような質問があるように、最初の方の引っかかりポイントかもしれません。「別のフォーム」といったキーワードを絡めていろいろと検索してみるとサンプルが出てくるかも)
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ