- PR -

DataGridのDataViewソートとテンプレート列

投稿者投稿内容
マシュー
常連さん
会議室デビュー日: 2002/11/29
投稿数: 39
投稿日時: 2005-07-13 17:28
C#でWebアプリケーションを作成しています。
チェックボックスを配置したDataGridがあるのですが、
DataViewを使用してソートを行うとDataTableの様にRowsがない(当たり前)
ので僕のやり方ではチェックボックスのオンオフを制御できません。
よって現在はソート機能のないものになっています。

DataView でソートしたものをそのままDataTableに反映できたら良いと思うのですが
方法がわかりません、良い方法がありましたらお教えください。

@ソートは下記の通りDataViewかDefaultViewを使用して行っています。
<DataTable>.DefaultView.Sort = e.SortExpression;
<Grid>.DataSource =<DataTable>.DefaultView;
<Grid>.DataBind();

Aチェックボックスは下記のようにFindControlを使用してDataTableを読んで配置しています。
for (int i=0;i< <DataTable>.Rows.Count;i++)
{ {
switch(<DataTable>.Rows[i]["YUKO_FLG"].ToString())
{
case"0":
((CheckBox)<Grid>.Items[i].Cells[0].FindControl("Chk_Yuko")).Checked=false;
break;
case"1":
((CheckBox)dgr_Grid.Items[i].Cells[0].FindControl("Chk_Yuko")).Checked=true;
break;
  }
}

しかしDataViewにはRowがないためAを実行することは出来ません。

以上 よろしくお願いします。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-07-13 17:46
テンプレートに
コード:
<asp:CheckBox id='foo' runat='server'
 Checked='<%# DataBinder.Eval(Container.DataItem, "YUKO_FLG") == "1" %>' />


とするのが楽なんだけど、DataBind 以外のタイミングで判断したいのであれば
<DataTable>.DefaultView.Count や <DataTable>.DefaultView[i]["YUKO_FLG"] を
使えばいいんじゃないでしょうか。

マシュー
常連さん
会議室デビュー日: 2002/11/29
投稿数: 39
投稿日時: 2005-07-14 10:08
にしざきさん、ありがとうございます。
にしざきさんのおっしゃられる(ASP.NETというのでしょうか?)方法でやりたいと思います。
「ASPがデータを読んで、評価しチェックをつけてくれる」という事ですよね。

そこで早速以下の通りやって見たのですが、うまくチェックが入りません。
どこが間違った点があると思うのですがご指摘ください。

@DataGridのColumns{12}にYUKO_FLGのデータが格納項目"YUKO_FLG"を作成しました。
AHTMLデザイナーで
<asp:CheckBox id="Chk_Yuko" runat="server"></asp:CheckBox>

<asp:CheckBox id='Chk_Yuko' runat='server'
Checked='<%# DataBinder.Eval(Container.DataItem, "YUKO_FLG") == "1" %>' ></asp:CheckBox>
としました。

以上 よろしくお願いします。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-07-14 11:18
おっと。
書式無の DataBinder.Eval は object 型を返すようでした。とすると、
コード:
DataBinder.Eval( ... ).ToString() == "1"


なのかな?
マシュー
常連さん
会議室デビュー日: 2002/11/29
投稿数: 39
投稿日時: 2005-07-14 11:37
にしざきさん、ありがとうございました。

コード:
--------------------------------------------------------------------------------

DataBinder.Eval( ... ).ToString() == "1"


--------------------------------------------------------------------------------
でうまく行きました。
非常に助かりました。ありがとうございました。



nori
ベテラン
会議室デビュー日: 2004/09/02
投稿数: 56
投稿日時: 2005-07-15 10:50
いつもお世話になっております。

私も同じようなことで悩んでいます。(VBでWebアプリを作成しています)
そこで同じようにやってみました。

---------------------------------------------------------
<asp:CheckBox id=CheckBox1 runat='server'
Checked='<%# DataBinder.Eval(Container.DataItem, "YUKO_FLG") == "1" %>' ></asp:CheckBox>
---------------------------------------------------------

DataGridにテンプレートでチェックボックスを作成しています。
チェックボックスのIDは「CheckBox1」です。
テーブルにはチェックボックスの項目はありません。

ここで一つ分からないことがあります。
この"YUKO_FLG"ってどこで設定するのでしょうか?

どうぞよろしくお願い致します。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-07-15 21:27
YUKO_FLG は元のテーブルのフィールド名です。
nori さんがチェックボックスに対応させたいフィールド名に置き換えてください。
マシューさんは、このフィールドに0か1かを格納して、これをチェックボックスの
チェック状態に対応させるようにして表示したようです。

また、VB.NET で作成しているのであれば、おそらく aspx ファイルのコンパイル
結果も VB.NET にするのでしょう(<@Page language="VB">ですよね)から、
比較は == ではなく = で行うことになるでしょう。
nori
ベテラン
会議室デビュー日: 2004/09/02
投稿数: 56
投稿日時: 2005-07-19 10:51
にしざき様、ありがとうございます。

やはりDataGridの元となるテーブルにフィールドを
設けないとダメなのでしょうか?
できればテーブルには持たせたくないのです。

・・・もしかして、テーブルにフィールドを設けなくても
DataGridを表示するためのSQL文でこの項目を用意して
あげればいいのかなぁ?
ちょっと試してみます♪

比較演算子は=ですよネ。基本的なところでした;;

スキルアップ/キャリアアップ(JOB@IT)