- PR -

DetailsViewのTemplateFieldが表示されない

1
投稿者投稿内容
かつひと
常連さん
会議室デビュー日: 2006/06/01
投稿数: 32
投稿日時: 2006-10-12 20:43
 いつも勉強させて頂いております。
DetailsViewのTemplateFieldについて、ご存知の方ありましたらよろしくお願い致します。

 ASP.NET 2.0でWebアプリケーションを開発中です。
オブジェクトバインディングでDetailsViewと対応クラスを連結させているのですが、TemplateFieldに変換すると、そのフィールド値が表示されません(通常のBoundFieldでは表示され、TmplateFieldに変換すると表示されなくなります)。
間違っている箇所があるのか、解決策を教えて頂けないでしょうか。

<asp:DetailsView ID="Dtv" runat="server" DataSourceID="Ods" AutoGenerateRows="False">
<Fields>
<asp:BoundField DataField="RegisteredDateTime" HeaderText="登録日" SortExpression="RegisteredDateTime" DataFormatString="{0:yyyy/MM/dd}" HtmlEncode="False" >
</asp:BoundField>
<asp:TemplateField HeaderText="データ1">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Data1") %>'></asp:TextBox>
</EditItemTemplate>
<InsertItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Data1") %>'></asp:TextBox>
</InsertItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Data1") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</asp:DetailsView>

<asp:ObjectDataSource ID="Ods" runat="server" SelectMethod="Get" TypeName="Class1">
・・・
・・・
・・・
</asp:ObjectDataSource>
かつひと
常連さん
会議室デビュー日: 2006/06/01
投稿数: 32
投稿日時: 2006-10-12 21:34
 上記、記載し忘れましたが、DetailsViewのPreRenderイベントで、このようなテキスト改行表示処理を行っています。
これが不具合を作っているようにも思います。

protected void Dtv_PreRender(object sender, EventArgs e)
{
//参照表示でテキストを改行させる
foreach (DetailsViewRow r in ((DetailsView)sender).Rows)
{
foreach (TableCell tc in r.Cells)
{
if(
tc.Text = tc.Text.Replace(Environment.NewLine, "<br />");
}
}
}
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-10-13 00:36
テンプレートフィールドにすることで、ラベルが追加され、そこに文字列が表示されるようになりますよね。
なので、TableCellのTextじゃなくて、TableCellに含まれているラベルのTextを取り出して改行するようにしないといけないんじゃないでしょうか。
改行処理を行っているところで止めてみて、文字列がとりだせているかどうか確認してみてはどうでしょう。

GridViewでの例ですけど参考になるかもしれません。
http://dotnetfan.org/blogs/dotnetfanblog/articles/668.aspx
かつひと
常連さん
会議室デビュー日: 2006/06/01
投稿数: 32
投稿日時: 2006-10-13 17:02
どっとねっとふぁん様

 ご指摘通り、改行処理を以下のように変更するとTemplateFieldも表示されるようになりました。
ありがとうございます。

 問題点、もっと良い方法などありましたら、ぜひよろしくお願い致します。

foreach (DetailsViewRow r in ((DetailsView)sender).Rows)
{
foreach (TableCell tc in r.Cells)
{
if (tc.Controls.Count != 0)
{
foreach (Control c in tc.Controls)
{
if (c is Label)
{
((Label)c).Text = ((Label)c).Text.Replace(Environment.NewLine, "<br />");
}
}
}
else
{
tc.Text = tc.Text.Replace(Environment.NewLine, "<br />");
}
}
}
1

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