トップ回答者
テーブルにレコードを追加するときの疑問

質問
-
お早うございます。zen73です。テーブルにレコードを4行追加したいのですが,ひとつ少ない3行しか追加できないでいます。
下のコードは,既存のレコードをすべて削除した後に新しくレコードを追加しています。
10
20
30
40
となることを期待しているのですが,
10
20
30
としかなりません。data[]にダミーのデータを1個追加してやれば,10,20,30,40とすべてを追加できることになりますが,これでは単に’間に合せ’にしか過ぎません。
何が原因で,最後のレコード「40」が追加できなくなっているのでしょうか?
重ねての質問になりますが(このあとにも確定の前にいろいろと試したいことがあるものですから)
編集の確定drv.EndEdit();はアとイのどちらにするのがよいのでしょうか?
よろしくお願いします。
コード ブロックprivate void button1_Click(object sender, EventArgs e)
{
int[] data = new int[] { 10, 20, 30, 40};
DataView dv = new DataView();
dv.Table = trialDataSet.code;
int cnt = dv.Count;
//すべてのレコードを削除
for (int i = 0; i < cnt; i++)
dv.Delete(0);//レコードを追加
DataRowView drv;
for (int i = 0; i < data.Length; i++)
{
drv = dv.AddNew();
drv["大科目"] = "";
drv["コード"] = data[i];
drv["小科目"] = "";
drv["今年度予算"] = 0;
drv["前年度予算"] = 0;//ア//drv.EndEdit();
}//イ//drv.EndEdit();
}
回答
-
こんにちわ、
少し補足させてもらいますね。
今回、イの位置でdrv.EndEdit()としたときにエラーがでたのは
「未割り当てのローカル変数'drv'が使用されました。」
というメッセージだと思います。
ためしに、宣言時にnullで初期化を行ってみてください。
コンパイルエラーが消えると思います。
で、今回のご質問の件ですが、ぶっちゃけていうと、どちらでも動作上は問題ないです。
最終的な確定さえしっかり行えばいいので・・・
ただ、個人的には、DataRowViewのインスタンスの値を変更している前後を
BeginEdit()とEndEdit() でくくるのが望ましいと思っています。
(ここでは新規登録にあたるので、BeginEditをAddNew()に置き換えて考えてみてください。)
ここでは、AddNewメソッドで暗黙的に、EndEdit()が呼ばれますが、後から見た人には、
「Endがなんでないの??」
ということになりかねません。
(AddNewメソッドの仕様を確認しろといわれればそれまでですが・・・)
また、イのタイミングですと、dataの値如何によっては、drvのインスタンスが作成されないなど、
もうすこし厳密なコーディングを行う必要がでてきてしまいます。
(今後、どのような形でこのサンプルコードを実際のアプリケーションに取り込んでいくのかによりますが・・)
なので・・
AddNew とEndEditで囲むアをお勧めします。
すべての返信
-
こんにちわ、
少し補足させてもらいますね。
今回、イの位置でdrv.EndEdit()としたときにエラーがでたのは
「未割り当てのローカル変数'drv'が使用されました。」
というメッセージだと思います。
ためしに、宣言時にnullで初期化を行ってみてください。
コンパイルエラーが消えると思います。
で、今回のご質問の件ですが、ぶっちゃけていうと、どちらでも動作上は問題ないです。
最終的な確定さえしっかり行えばいいので・・・
ただ、個人的には、DataRowViewのインスタンスの値を変更している前後を
BeginEdit()とEndEdit() でくくるのが望ましいと思っています。
(ここでは新規登録にあたるので、BeginEditをAddNew()に置き換えて考えてみてください。)
ここでは、AddNewメソッドで暗黙的に、EndEdit()が呼ばれますが、後から見た人には、
「Endがなんでないの??」
ということになりかねません。
(AddNewメソッドの仕様を確認しろといわれればそれまでですが・・・)
また、イのタイミングですと、dataの値如何によっては、drvのインスタンスが作成されないなど、
もうすこし厳密なコーディングを行う必要がでてきてしまいます。
(今後、どのような形でこのサンプルコードを実際のアプリケーションに取り込んでいくのかによりますが・・)
なので・・
AddNew とEndEditで囲むアをお勧めします。
-