我试图在GridView
事件的RowDataBound
单元格中添加一些文字:
protected void gvPatientSearch_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
DataRow dr = ((DataRowView)e.Row.DataItem).Row;
if (Convert.ToBoolean(dr["Confidential"]))
{
String name = String.Copy(e.Row.Cells[1].Text);
//the problem is the following line
e.Row.Cells[1].Text = "<b><font color='red'>!</font></b>" + name;
}
}
}
出于某种原因,似乎无论我做什么,原始文本都会被删除。当我删除注释下面的行时,名称正常显示而没有感叹号;当我添加附加代码时,由于某种原因,原始文本变为空白字符串,我只得到感叹号。无论有没有String.Copy
,我都试过这个 - 我不认为这是必要的,但我想我会尝试以防万一。没运气。
我认为这不相关,但行中的第一列是隐藏列,其中包含1或0.如果值为1,我想添加感叹号。数据在那里,这部分被正确调用,我只是无法得到这个名字。
为什么会发生这种情况的任何想法?
编辑:下面的前端代码
<asp:GridView ID="gvPatientSearch" runat="server" Width="100%" CellPadding="4" ForeColor="#333333" GridLines="None" AllowPaging="True" AllowSorting="True"
PageSize="25" OnPageIndexChanging="gvPatientSearch_PageIndexChanging" OnSorting="gvPatientSearch_Sorting" OnRowDataBound="gvPatientSearch_RowDataBound"
AutoGenerateColumns="false" PagerSettings-Position="TopAndBottom" PagerStyle-HorizontalAlign="Right" PagerSettings-Mode="NumericFirstLast" PagerSettings-PageButtonCount="5"
PagerSettings-FirstPageText=" First " PagerSettings-LastPageText=" Last " PagerSettings-PreviousPageText=" Previous " PagerSettings-NextPageText=" Next ">
<AlternatingRowStyle BackColor="White" />
<EditRowStyle BackColor="#2461BF" />
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#2461BF" ForeColor="White" />
<RowStyle BackColor="#EFF3FB" />
<SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
<SortedAscendingCellStyle BackColor="#F5F7FB" />
<SortedAscendingHeaderStyle BackColor="#6D95E1" />
<SortedDescendingCellStyle BackColor="#E9EBEF" />
<SortedDescendingHeaderStyle BackColor="#4870BE" />
<Columns>
<asp:BoundField HeaderText="Confidential" DataField="Confidential" ItemStyle-CssClass="hiddencol" HeaderStyle-CssClass="hiddencol"></asp:BoundField>
<asp:HyperLinkField DataTextField="PatientName" DataNavigateUrlFields="PatientIdInternal" DataNavigateUrlFormatString="PatientProfile.aspx?InternalID={0}" HeaderText="Patient Name"
SortExpression="PatientName" />
<asp:BoundField DataField="PatientID" HeaderText="Patient ID" SortExpression="PatientID" />
<asp:BoundField DataField="AccountNumber" HeaderText="Account Number" SortExpression="AccountNumber" />
<asp:BoundField DataField="DateOfBirth" HeaderText="Date Of Birth" SortExpression="DateOfBirth" DataFormatString="{0:d}" />
<asp:BoundField DataField="PracticeName" HeaderText="Practice Name" SortExpression="PracticeName" />
<asp:BoundField DataField="PatientIdInternal" HeaderText="Internal ID" SortExpression="PatientIdInternal" Visible="false" />
</Columns>
</asp:GridView>
我可以在代码的这一部分看到Visual Studio中正确显示的所有其他字段的值,只有我尝试修改的名称字段显示为空字符串。
答案 0 :(得分:1)
HyperLinkField
呈现为超链接控件,因此您无法直接检索单元格的文本。如果您需要文本,则必须从控件而不是单元格中检索它:
HyperLink myLink = e.Row.Cells[1].Controls[0] as HyperLink;
String name = myLink.text;
另一种方法是在代码隐藏中执行DataBinder.Eval(e.Row.DataItem, "name")
直接从数据源中获取名称。
答案 1 :(得分:0)
我不知道为什么会这样,但我认为你可以通过使用这样的函数应用逻辑来解决它:
public string Exclaim(bool confidential, string originalText)
{
if (confidential) {
return "<b><font color='red'>!</font></b>" + originalText;
} else {
return originalText;
}
}
在gridview中,使用以下命令调用该函数:
<asp:TemplateField>
<ItemTemplate>
<%# Exclaim(Eval("Confidential"), Eval("Name"))%>
</ItemTemplate>
</asp:TemplateField>
我认为这样可行。
答案 2 :(得分:0)
我继续前进并将违规行更改为:
e.Row.Cells[1].Text = "<b>font color='red'>!</font></b> " + Convert.ToString(dr["PatientName"]);
仍然不知道为什么其他方式不起作用,如果其他人做了和答案我会将其标记为正确。