プロが教えるわが家の防犯対策術!

お世話になります。ASP.NET、C#でWeb開発しております。

DataGridの全行編集状態で、ボタン押下時に行の追加を行いたいのですが、途中まで入力したテキストボックスの表示がうまくいきません。
DataSetに行を追加して、DataBindしてしまうと、テキストボックスは空になってしまいます。
追加行以外は、ViewStateで復元したいのですが、可能でしょうか?

A 回答 (4件)

こんな感じではだめでしょうか?


//--保存--
//データグリッドから編集中の行を取得
DataGridItem dgi = this.DataGrid1.Items[4];
//データグリッドのセル内からテキストボックスを取得
TextBox tb = (TextBox)dgi.Cells[0].Controls[0];
//ビューステイトに保存
this.ViewState["testVal"]=tb.Text;

//--取り出し--
DataGridItem dgi = this.DataGrid1.Items[4];
TextBox tb = (TextBox)dgi.Cells[0].Controls[0];
//データグリッド内のテキストボックスにビューステイト内のテキストを反映
tb.Text=this.ViewState["testVal"].ToString();
    • good
    • 0

どうもお騒がせしております。


>(1)の方法は各テキストボックスのViewStateの値を取得する方法
こちらは、下記のように出来るようです。
//ViewStateに値をセット[]の中はキーとなります。
this.ViewState["TestKey"]="12345";
//ViewState内のキーに関連付けされている値を取得
if (ViewState["TestKey"] != null)
{
//ラベルにViewState内のキー「TestKey」に関連付けられている値を表示
this.Label1.Text=ViewState["TestKey"].ToString();
}
(if文は値の取得自体には関係無いですが一応。)

>(2)の方法は、DataTableのカラムの型がintに設定されている場合、テキストボックスの内容を反映する事ができません。
こちらなのですが・・・
自分で作成したDataTableでデータを入れても再現しませんでした
○データを入れる処理
//データテーブルを作成
DataTable dt1 = new DataTable();
//カラム作成
dt1.Columns.Add("intCol",System.Type.GetType("System.Int32"));
//新しい行を作成
DataRow dr =dt1.NewRow();
//以下(1)の場合でも(2)の場合でもコンパイル時、実行時共に例外は発生しませんでした。
(1)dr["intCol"]= int.Parse("54321");
(2)dr["intCol"]= "54321";
//新しく作成した行をテーブルに追加
dt1.Rows.Add(dr);
//ViewStateに保存
this.ViewState["t"]=dt1;
○データを取得する処理
//ViewStateからデータテーブルを取得
DataTable dt1 = (DataTable)this.ViewState["t"];
if (dt1!=null)
{
//データテーブル内の0行目の「intCol」列を取得しラベルに表示
this.Label2.Text=dt1.Rows[0]["intCol"].ToString();

また、明日時間がありましたら、DataGridのItemTemplate列のテキストボックスでも
ためしてみようかなと思ってます。
(必要が無い場合にはご連絡頂けるとうれしいです)
    • good
    • 0

すみません。

家に帰って改めてご質問を拝見し、
自分の回答の的外れ加減に驚いてしまいました・・・
改めて、分かる範囲でちゃんと回答したいと思うのですが
以下のような内容でよろしいのでしょうか?
1.DataGridとは別のテキストボックスにデータを入力
2.ボタン押下時にテキストボックス内のデータが
  DataSet(内のDataTable)に追加してよい状態であれば、行の追加
3.追加出来ない場合はテキストボックスに編集中の内容を残したいがうまくいかない

また見当違いの事を言っているようでヒヤヒヤものですが、
ご説明の補足をお願いします。
もし、コードが載せられるようでしたらお願いします。

この回答への補足

こちらの説明も足りなくてすみません。
テキストボックスは、DataGridのItemTemplate列のものです。

手順は以下のようになります。

1.ボタン押下
2.ポストバック
3.DataTableに行追加
4.DataBind()
5.HTML返信
6.編集中だったテキストボックスが元に戻ってしまう

テキストボックスを保持したい場合は、

(1)DataBind後に追加した行以外は、ViewStateで復元する
(2)3の前でテキストボックスの入力文字列をDataTableに反映しておく

どちらかの方法が必要になると思います。
しかし、(1)の方法は各テキストボックスのViewStateの値を取得する方法がわからず、(2)の方法は、DataTableのカラムの型がintに設定されている場合、テキストボックスの内容を反映する事ができません。

よろしくお願いします。

補足日時:2005/09/02 21:55
    • good
    • 0

DataTableをDataBindしてるのでしょうか?


実際試した訳ではないのですが、
その場合バインド前のDataTableのカラムが
A列B列だとし、DataGridにC列を追加した場合、
もう一度A列B列しか無いDataTableにバインドすると
関連の無いC列の情報は無くなってしまうような気がします。
DataTableにもDataGridと同じC列を追加し、データを
入れるのが一番簡単かなぁと思います。
    • good
    • 0

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