- PR -

GridView上での空の文字列("")表示について

1
投稿者投稿内容
ani
常連さん
会議室デビュー日: 2007/05/17
投稿数: 44
投稿日時: 2007-09-13 21:14
こんにちは。
いつもお世話になっております。

GridView上に空の文字列("")をセットした際、文字列が自動で置き換わってしまい困っています。

コード:
string Col2Str;
DataTable table;
DataRow row;

table = new DataTable();
table.Columns.Add("Col1", Type.GetType("System.String"));
table.Columns.Add("Col2", Type.GetType("System.String"));
row = table.NewRow();
row["Col1"] = "test";
row["Col2"] = "";
table.Rows.Add(row);
GridView1.DataSource = table;
GridView1.DataBind();
Col2Str = GridView1.Rows[0].Cells[2].Text;



上記のコードを実行すると、「Col2Str」に" "がセットされます。
半角スペースが" "に置き換わるなら理解できるのですが、なぜ""が置き換わるのでしょうか?
どうかご教示下さい。
Katze
ベテラン
会議室デビュー日: 2005/11/01
投稿数: 74
お住まい・勤務地: 1台でも せんだい
投稿日時: 2007-09-14 09:23
ホントのところはわかりませんが・・・

GridViewがhtmlになった場合テーブルになりますよね。
そのとき半角スペースではなく""だった場合、セルの枠線が表示されなくなるため変換をしているのではないでしょうか?

コード:
サンプル

<html>
	<body>
		<table border="1" bordercolor="black">
			<tr>
				<td></td>
				<td>何も無し</td>
			</tr>
			<tr>
				<td> </td>
				<td>半角スペース</td>
			</tr>
		</table>
	</body>
</html>


これをブラウザで見ると、1行目1列目の枠線が表示されず意図したイメージにならなくなるからのような気がします。

# 調べもせず100%憶測で書いているので、本当の理由がドキュメントに
# 載っているかもしれませんが・・・
ani
常連さん
会議室デビュー日: 2007/05/17
投稿数: 44
投稿日時: 2007-09-14 19:27
Katzeさん、レスありがとうございます。

サンプルコード、試させていただきました。
確かに空の文字列だとセルの枠線が表示されませんね。
ただ、半角スペースでも同様に枠線が表示されません。
であれば半角スペースも" "に置き換わってもよさそうな気がするのですが・・・。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-09-15 08:04
引用:

aniさんの書き込み (2007-09-14 19:27) より:

ただ、半角スペースでも同様に枠線が表示されません。
であれば半角スペースも" "に置き換わってもよさそうな気がするのですが・・・。


半角スペースと&nbsp;は正確には別のものとして扱われるからです。

この場合、スペースはトークンというか、語句と語句を切り分けるための記号でしかありません。
&nbsp;は明確に「ここにスペースを出せ」という意味なので、扱われ方が違うのでしょう。

<td> </td>
<td>&nbsp;</td>

これはそれぞれ

<td></td>
<td> </td>

こういった形で解釈されるのだと思われます。
HTML 的にもそれが正しい動作なんじゃないでしょうか。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
kiyokura
ベテラン
会議室デビュー日: 2007/08/08
投稿数: 69
お住まい・勤務地: 岡山
投稿日時: 2007-09-15 11:26
蛇足かもしれませんが、"&nbsp;"になってしまった出力を再度取得してこれを除去(?)するなら、HttpServerUtility.HtmlDecodeメソッドを利用すれば、なんとかなると思います。(と言うか、バンド後のGridView等から値を取得する際には、HtmlDecodeをするのが楽ですので、空文字列に限らないと思いますが。)


ただし、"&nbsp;"はHtmlDecodeすると空白(" ")に置き換わってしまうと思いますので、元々" "だったのか""だったのかの判別は、できなくなります。

この違いを正確に扱いたい場合は、別の手法を考える必要があると思います。
ani
常連さん
会議室デビュー日: 2007/05/17
投稿数: 44
投稿日時: 2007-09-20 20:10
>ぽぴ王子さん
レスありがとうございます。(返事が遅くなりすみません。)

引用:

ぽぴ王子さんの書き込み (2007-09-15 08:04) より:
半角スペースと は正確には別のものとして扱われるからです。

この場合、スペースはトークンというか、語句と語句を切り分けるための記号でしかありません。
は明確に「ここにスペースを出せ」という意味なので、扱われ方が違うのでしょう。

<td> </td>
<td> </td>

これはそれぞれ

<td></td>
<td> </td>

こういった形で解釈されるのだと思われます。
HTML 的にもそれが正しい動作なんじゃないでしょうか。



なるほど。
確かにおっしゃられる通りですね。
納得できました。
空の文字列("")が置き換わるのはそういう仕様なんでしょうね。
どうもありがとうございました。


>kiyokuraさん
レスありがとうございます。(返事が遅くなりすみません。)

引用:

kiyokuraさんの書き込み (2007-09-15 11:26) より:

ただし、" "はHtmlDecodeすると空白(" ")に置き換わってしまうと思いますので、元々" "だったのか""だったのかの判別は、できなくなります。

この違いを正確に扱いたい場合は、別の手法を考える必要があると思います。



そうですね。確かに判別できませんね。
別の方法を考えたいと思います。
どうもありがとうございました。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-09-20 22:39
引用:
引用:

kiyokuraさんの書き込み (2007-09-15 11:26) より:

ただし、" "はHtmlDecodeすると空白(" ")に置き換わってしまうと思いますので、元々" "だったのか""だったのかの判別は、できなくなります。

この違いを正確に扱いたい場合は、別の手法を考える必要があると思います。



そうですね。確かに判別できませんね。

GridViewのRowCreatedかRowDataBoundあたりで((DataRowView)e.Row.DataItem)["Col2"]を見れば
一応、元のデータが空文字であることは確認できますよ。
1

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