2016-07-29 5 views
0

Ich versuche, einen Text vorangestellt wird, was bereits in einer GridView Zelle im RowDataBound Ereignisse:seltsames Verhalten bei dem Versuch, Text in einer Gridview-Zelle zu aktualisieren

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; 
      } 
     } 

    } 

Aus irgendeinem Grunde scheint es, dass, egal was ich Wurde der ursprüngliche Text gelöscht? Wenn ich die Zeile unter dem Kommentar entferne, wird der Name normalerweise ohne das Ausrufezeichen angezeigt. Wenn ich den Append-Code hinzufüge, wird aus irgendeinem Grund der ursprüngliche Text zu einer leeren Zeichenfolge und ich erhalte nur das Ausrufezeichen. Ich habe dies mit und ohne die String.Copy versucht - ich dachte nicht, dass dies erforderlich wäre, aber dachte, ich würde es nur für den Fall versuchen. Kein Glück.

Ich denke nicht, dass dies relevant ist, aber die erste Spalte in der Zeile ist eine ausgeblendete Spalte, die eine 1 oder eine 0 enthält. Wenn der Wert 1 ist, möchte ich das Ausrufezeichen hinzufügen. Die Daten sind da und dieser Teil wird korrekt aufgerufen, ich kann den Namen einfach nicht erhalten.

Irgendwelche Ideen, warum das passieren würde?

EDIT: Front-End-Code unten

<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> 

kann ich die Werte aller anderen Bereichen sehen richtig in Visual Studio an diesem Teil des Codes, nur das Namensfeld, das ich zu ändern versuche zeigt bis zu wird als leere Zeichenfolge angezeigt.

+0

Können Sie das Front-End in Bezug auf dieses Post? Sie können den Text aus einer Zelle in einem RowDataBound-Ereignis nicht abrufen, wenn sich der Text nicht in einem Steuerelement befindet. Versuchen Sie, den Text zu einem Label oder einem Literal zu machen: 'label myLabel = e.row.findcontrol (" meinLabel ")', 'String name = myLabel.Text' – Santi

+0

@TylerRoper siehe update –

+0

sehe meine Antwort unten, hoffentlich hilft! – Santi

Antwort

1

Eine HyperLinkField wird als Hyperlink-Steuerelement gerendert, und aus diesem Grund können Sie den Text der Zelle nicht direkt abrufen. Wenn Sie den Text mögen, müssen Sie es aus der Steuerung abrufen, nicht die Zelle:

HyperLink myLink = e.Row.Cells[1].Controls[0] as HyperLink; 
String name = myLink.text; 

Eine Alternative wäre, den Namen zu greifen direkt von der Datenquelle durch DataBinder.Eval(e.Row.DataItem, "name") in Ihrem Code-behind zu tun.

+0

Warum kann ich den Inhalt der anderen Zellen im Debugger sehen? Sie sind alle BoundFields. –

+0

Ich denke, es muss etwas mit dem HyperLinkField oder etwas zu tun haben, dass man sich in mancher Hinsicht von den anderen unterscheidet. Vielen Dank für Ihre Antwort. Ich werde sie direkt aus der Datenquelle ziehen. –

+0

@eddie_cat Korrigieren. Ich glaube, ich habe falsch verstanden, bitte sehen Sie meine aktualisierte Antwort. – Santi

0

Ich weiß nicht, warum das passiert, aber ich denke, man kann so mit einer Funktion, indem Sie Logik um es:

public string Exclaim(bool confidential, string originalText) 
{ 
    if (confidential) { 
     return "<b><font color='red'>!</font></b>" + originalText; 
    } else { 
     return originalText; 
    } 
} 

In Ihrem gridview, rufen Sie die Funktion:

<asp:TemplateField> 
    <ItemTemplate> 
     <%# Exclaim(Eval("Confidential"), Eval("Name"))%> 
    </ItemTemplate> 
</asp:TemplateField> 

Ich denke, das würde funktionieren.

0

Ich ging voran und tat es, indem die Codezeile zu diesem Wechsel:

e.Row.Cells[1].Text = "<b>font color='red'>!</font></b> " + Convert.ToString(dr["PatientName"]); 

wissen immer noch nicht, warum die andere Art und Weise nicht funktioniert, wenn es jemand anderes tut und Antworten Ich werde markiert es richtig .