- PR -

Container.DataItemの判定をしてDataGridに表示したい

投稿者投稿内容
キョウ
常連さん
会議室デビュー日: 2003/04/30
投稿数: 49
投稿日時: 2003-06-24 11:42
VS.NET2002でASP.NETの開発をしております。言語はC#です。

DataGridでデータベースから取ってきた値をテンプレートを使って
バインドさせているのですが、データベースから取ってきた値がEmpty値
の場合、その行が潰れてしまいます。Empty値の場合は「 」を
代わりに記述したいのと思っています。

<%# DataBinder.Eval(Container.DataItem, "hoge_name")%>
hoge_nameが空白の場合、「&nbsp;」を吐き出したいのです。

ですが、どのように記述したらよいのか分からなくて困っています。
aspxファイルでのif文の書いてみましたが、分からなく、コードビハインド
ファイルに変換するパブリック関数を書いてみても無理でして。。。
(多分、書き方が悪かったのだとおもいますが)

データベースからデータを取得段階で、空白だったら&nbsp;に変換する
という事は勿論可能なのですが、SQL文に画面の制御的なものは
できるだけ入れたくないと考えております。

すみませんが、アドバイスをお願いします。
TARO
会議室デビュー日: 2003/05/30
投稿数: 7
投稿日時: 2003-06-24 15:49
こんにちわ。

aspxファイルのbodyタグにonloadイベントを追加して、
JavaScriptのソースを記述してみるというのはいかがでしょうか?

非常に安直なソースですが、サンプルをのせてみます

function BodyLoad()
{
for(i=0; i<document.all.length; i++) {
if(document.all(i).tagName == "TD")
{
if( document.all(i).innerHTML == null || document.all(i).innerHTML == "" )
{
document.all(i).innerHTML = "&nbsp;";
}
}
}
}

以上、お役に立てれば幸いです
キョウ
常連さん
会議室デビュー日: 2003/04/30
投稿数: 49
投稿日時: 2003-06-24 19:43
ありがとうございます、確かにバッチリできました。
document.allですべてのタグが取得できるんですね。
このような使い方もできるなんて、JavaScriptは奥が深いですね。
非常に勉強になります。

この手は奥の手としてとっておいて、できればサーバサイドの処理で実装したい
と考えております。(教えてもらったのにスミマセン。)
ネットを検索していて、下記のような記述があるのを発見しました。

<ItemTemplate>
  <%# iif((DataBinder.Eval(Container.DataItem, "count") = 0), "無", "在") %>
</ItemTemplate>

実際はこのiifを使っても同じようにやってもできなかったのですが、
実現は可能であると思って、(希望して!?)試行錯誤しております。
ぴで
大ベテラン
会議室デビュー日: 2002/10/10
投稿数: 123
お住まい・勤務地: 東京
投稿日時: 2003-06-25 09:18
aspxにロジックを書くと分かりにくいので、いつもはこのように書いています。
コード:
○aspx側
<%# DispCount(Container.DataItem) %>

○コードビハインド側
protected string DispCount(object DataItem)
{
  DataRow drow = ((DataRowView)DataItem).Row;
  string strVal drow["count"].ToString();

  if(strVal != "")
  {
    strVal = "&nbsp;"
  }

  return strVal;
}

未記入
ベテラン
会議室デビュー日: 2002/09/10
投稿数: 68
投稿日時: 2003-06-25 09:26
三項演算子なんかでむりやり一行にできなくはないでしょうが、
メソッドを使うのが結局は、すっきりするのでは?

<%# Empty2sp(DataBinder.Eval(Container.DataItem, "hoge_name"))%>

でコードビハインドに

protected string Empty2sp(object obj)
{
//適当な処理
}

スペースに余裕がある場合は、
aspxに問答無用で&nbsp;を書いてしまうのが、一番楽ですが。
未記入
ベテラン
会議室デビュー日: 2002/09/10
投稿数: 68
投稿日時: 2003-06-25 09:27
かぶった
キョウ
常連さん
会議室デビュー日: 2003/04/30
投稿数: 49
投稿日時: 2003-06-25 10:25
ぴで様、仕様書無しさん様、ばっちりできました、ありがとうございます。
前にコードビハインド側で書いていたときには、以下の書き方でエラーでした。

失敗例
aspx側
<%# changes(DataBinder.Eval(Container.DataItem,"YOSNOB"))%>

コードビハインド側
public string changes(string strIn)
{
 if(strIn.Trim()=="")
 {
  return strIn.Trim();
 }
 else
 {
  return "&nbsp;";
 }
}

今回、引数をDataItemを受けることによって正常に処理できました。
最初、ぴで様のソースをコピペで使っていて、うまく行かなくて
あせったのですが、「if(strVal != "")」の部分が「if(strVal == "")」
にして期待通りの動きをしてくれました。

ありがとうございました!
ぴで
大ベテラン
会議室デビュー日: 2002/10/10
投稿数: 123
お住まい・勤務地: 東京
投稿日時: 2003-06-25 10:42
引用:
キョウさんの書き込み (2003-06-25 10:25) より:
ぴで様、仕様書無しさん様、ばっちりできました、ありがとうございます。
前にコードビハインド側で書いていたときには、以下の書き方でエラーでした。

失敗例
aspx側
<%# changes(DataBinder.Eval(Container.DataItem,"YOSNOB"))%>

コードビハインド側
public string changes(string strIn)
{

stringで取りたいなら
<%# changes(DataBinder.Eval(Container.DataItem,"YOSNOB").ToString())%>
ですね!

引用:
今回、引数をDataItemを受けることによって正常に処理できました。
最初、ぴで様のソースをコピペで使っていて、うまく行かなくて
あせったのですが、「if(strVal != "")」の部分が「if(strVal == "")」
にして期待通りの動きをしてくれました。

ありがとうございました!

逆でしたね。。。

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