資料控制項支援多種用於處理空值或缺失資料的方法。例如,GridView、FormView和DetailsView都支援EmptyDataText或EmptyDataTemplate屬性,當資料來源沒有傳回資料行的時候,你可以使用這些屬性來指定控制項顯示的內容。我們只需要設定EmptyDataText和EmptyDataTemplate其中的一個(如果兩個都設定了,EmptyDataTemplate會被重載)。你也可以在綁定欄位(和衍生的欄位類型)、範本欄位或資料來源參數物件上指定ConvertEmptyStringToNull屬性,指明在呼叫相關的資料來源操作之前,來自客戶端的String.Empty值必須轉換為空值。
ObjectDataSource也支援ConvertNullToDbNull屬性,當相關的方法要求用DbNull取代空值(Visual Studio資料集中的TableAdapter類別就有這個需求)的時候,我們就可以把這個屬性設為真。你也可以指定綁定欄位(和衍生的欄位類型)的NullDisplayText屬性,當資料來源回傳的某個欄位的值為空的時候,它指定顯示的內容。如果在編輯模式中這個值沒有發生變化,那麼在更新操作中這個值會以空值的形式傳回給後端資料來源。最後,你還可以指定資料來源參數的DefaultValue屬性,如果某個傳遞進來的參數值為空的時候,屬性就會給參數指定預設值。這些屬性是"鍊式反應"的,例如,如果ConvertEmptyStringToNull和DefaultValue都被設定了,那麼String.Empty值會先轉換為空(null),接著被轉換為預設值。
<asp:DetailsView…...>
<Fields>
<asp:BoundField DataField="Phone" HeaderText="Phone" NullDisplayText="not listed" SortExpression="Phone" />
<asp:BoundField DataField="Fax" HeaderText="Fax" NullDisplayText="not listed" SortExpression="Fax" />
</Fields>
<EmptyDataTemplate>
<asp:Image ID="Image1" runat="server" ImageUrl="~/Images/warning.gif" />There are no records to display
</EmptyDataTemplate>
</asp:DetailsView>
<asp:SqlDataSource ……>
<UpdateParameters>
<asp:Parameter Name="ContactTitle" Type="String" DefaultValue="Owner" ConvertEmptyStringToNull="true" />
<asp:Parameter Name="Region" Type="String" ConvertEmptyStringToNull="true" />
<asp:Parameter Name="Phone" Type="String" ConvertEmptyStringToNull="true" />
<asp:Parameter Name="Fax" Type="String" ConvertEmptyStringToNull="true" />
<asp:Parameter Name="CustomerID" Type="String" />
</UpdateParameters>
……
</asp:SqlDataSource>
你可以使用這些處理空值的屬性來實作下拉清單過濾器,讓它開始時顯示資料來源的所有值,直到過濾器中的某個值被選取為止。我們是這樣實作它的:首先為下拉清單新增一個空字串值的資料項,並設定資料來源中的與下拉清單相關的ControlParameter(控制項參數)的ConvertEmptyStringToNull屬性。
接著在資料來源的SelectCommand中,你可以透過偵測空值來傳回所有(沒有過慮)值。下面的範例示範了這個技術,它使用了一個簡單的SQL指令,當然你也可以在預存程序的實作中執行空值偵測。請注意下拉清單的AppendDataBoundItems屬性的使用,它允許來自下拉清單資料來源的值被加入到"ALL"(這個項目是我們靜態新增的)資料項目後面。同時我們要注意,在預設情況下,如果傳遞給SelectCommand 的相關參數的值中只要有一個為空,SqlDataSource就不會執行Select操作。當傳遞了空值的時候,為了強制Select操作執行,你可以把它的CancelSelectOnNullParameter屬性設為假。
<asp:DropDownList AppendDataBoundItems="True" AutoPostBack="True" DataSourceID="SqlDataSource2" DataTextField="state" DataValueField="state" ID="DropDownList1" runat="server">
<asp:ListItem Value="">ALL</asp:ListItem>
</asp:DropDownList>
<asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:Pubs %>" ID="SqlDataSource2" runat="server" SelectCommand="SELECT DISTINCT [state] FROM [authors]">
</asp:SqlDataSource>
<asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:Pubs %>" ID="SqlDataSource1" runat="server" SelectCommand="SELECT au_id, au_lname, au_fullname, state @state, state)" CancelSelectOnNullParameter="False">
<SelectParameters>
<asp:ControlParameter ControlID="DropDownList1" Name="state" PropertyName="SelectedValue" Type="String" />
</SelectParameters>
</asp:SqlDataSource>