2009-07-16 10 views
0

Ich benutze eine GridView in asp.net 2.0 und ich möchte inline bearbeiten. Ich verwende eine Objektdatenquelle. Da ich Validierungssteuerelemente für die Ganzzahlfelder in meiner Gridview verwenden möchte, habe ich sie in <TemplateFields> umgewandelt und einen Datentypvalidator und einen Bereichsvalidierer hinzugefügt. Dadurch kann ich entweder ein leeres Feld oder einen ganzzahligen Wert zwischen 0 und 999 haben.ASP.NET - GridView - EditItem - Nullwert für Ganzzahlen?

Ich versuche ein "-" anzuzeigen, wenn der Wert der Eigenschaft nicht definiert ist. Es gibt keine Null für eine ganze Zahl, also habe ich beschlossen, -1 als Wert zu verwenden, um eine Null anzuzeigen.

Ich formatiere die um das "-" anzuzeigen, wenn der Wert -1 ist. Ich mache das wie folgt:

<ItemTemplate> 
    <asp:Label ID="lblPC" runat="server" Text='<%# FormatIntegerToText(Eval("PitchCount"),"-") %>'></asp:Label> 
</ItemTemplate> 

Im Code hinter ich die Funktion FormatIntegerToText definiert sich wie folgt:

Protected Function FormatIntegerToText(ByVal value As Object, ByVal nullvalue As String) As String 
     ' Make sure value is not null... if so, return "-" 
     If value = Null.NullInteger() Then 
      Return nullvalue 
     Else 
      Return value.ToString() 
     End If 
End Function 

All dies funktioniert super. Jetzt kommt das Problem ... wenn ich meine Schaltfläche Bearbeiten klicken, wird der <EditItem> angezeigt wird (mit Textboxen etc.), aber alle „null“ Werte angezeigt als -1

Ich habe diese Zeit als meine <EditItemTemplate>

<EditItemTemplate> 
    <asp:textbox ID="txtPC" runat="server" Text='<%# Bind("PitchCount") %>' width="25" Columns="2"></asp:textbox> 
    ....a couple of validators.... 
</EditItemTemplate> 
obwohl

ich, ich könnte den Wert der folgenden umformatieren tun, die in das Textfeld platziert wird:

<EditItemTemplate> 
    <asp:textbox ID="txtPC" runat="server" Text='<%# FormatIntegerToText(Bind("PitchCount")) %>' width="25" Columns="2"></asp:textbox> 

aber wenn ich dies tun, erhalte ich einen Übersetzungsfehler, dass Bind keine anerkannte Funktion ist.

Meine Frage ist, warum ist das nicht erlaubt, und wie kann ich es umgehen?

Antwort

0

Sie möchten dies möglicherweise anders machen. Anstatt eine gebundene Spalte zu verwenden, erstellen Sie eine Vorlagenspalte, die Ihnen volle Kontrolle über den Inhalt gibt und Ihnen erlaubt, eine Funktion zu schreiben, um den Text während der Anzeige zu formatieren und den Inhalt bei der Bearbeitung auf den entsprechenden Wert einzustellen.

0

Bindung ist nicht wirklich eine Funktion, deshalb erhalten Sie einen Kompilierungsfehler. Weitere Details finden Sie unter Eilon Lipton's Blog.

Versuchen Sie, Bind durch Eval zu ersetzen.

Sie würden auch neuen Wert in RowUpdating Ereignishandler speichern müssen:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
    e.NewValues["PitchCount"] = 
     ((TextBox)((GridView)sender).Rows[e.RowIndex].FindControl("txtPC")).Text; 
} 

Ein weiterer Ansatz ist nullable type zu verwenden. Anstelle von Integer Nullable(Of Integer) verwenden. Verwenden Sie dann NullDisplayText property, um "-" anstelle von NULL zu zeigen:

<asp:BoundField DataField="PitchCount" NullDisplayText="-" HeaderText="PitchCount" 
    SortExpression="PitchCount />