如何在EditItemTemplate中使用Bind()获取可空属性?

时间:2011-08-11 18:36:38

标签: asp.net data-binding gridview

我有GridView绑定到某个实体数据源。编辑已启用。 GridView中显示的实体与另一个实体相关联。假设我正在显示Machines正在创建Products(每台机器没有或一种产品类型)。我正在使用

在gridview中显示产品的名称
<ItemTemplate>
    <asp:Label ID="Label1" runat="server" 
        Text='<%# ((Machine)Container.DataItem).Product == null ? "-" : ((Machine)Container.DataItem).Product.Name %>'>
    </asp:Label>
</ItemTemplate>

运作良好。现在,我希望能够在EditItemTemplate中修改相关产品。所以我添加了

<EditItemTemplate>
    <asp:DropDownList runat="server" ID="ddProducts" DataSourceID="dsProducts" 
            DataTextField="Name" DataValueField="ProductID" 
            SelectedValue='<%#  Bind("Product.ProductID") %>'
            AppendDataBoundItems="true">
            <asp:ListItem Text="" Value="0"></asp:ListItem>
    </asp:DropDownList>
</EditItemTemplate>

它不起作用,因为当机器没有关联的产品时,没有匹配的SelectedValue,无论如何Productnull。我在DropDownList中添加了空项,当机器没有产品时应该选择它。此外,如果我使用产品编辑机器并选择此项目,则列应该为空。

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:3)

我现在就开始工作了。 GridView会自动将空值转换为空字符串,因此问题不在于绑定,而在于我为空值添加的特殊项目。

更改

<asp:ListItem Text="" Value="0"></asp:ListItem>

<asp:ListItem Text="" Value=""></asp:ListItem>

立即解决了问题......

答案 1 :(得分:1)

您可以使用GridView's eventsRowDataBoundRowEditing。其中一种方法是:

private void GridView_RowEditing(object sender, GridViewEditEventArgs e)
    {
         int index = e.NewEditIndex;
         GridView1.EditIndex = index;
         DropdownList ddrList = Gridview1.Rows[index].FindControl("ddProducts") as DropDownList;
         DataRowView view = (DataRowView)GridView1.Rows[index].DataItem;
         if(!ddrList.FindItemByValue(view.Row["Product.ProductID"].ToString().Equals(String.Empty))
            ddrList.FindItemByValue(view.Row["Product.ProductID"].ToString()).Selected = true;
    }

答案 2 :(得分:0)

试一试:

SelectedValue='<%# Eval("Product.ProductID") != null ? Bind("Product.ProductID") : 0 %>'

显然,用你想要的任何东西替换0。

答案 3 :(得分:0)

好的,试一试:

SelectedValue='<%# CheckIfValueIsNull(Bind("Product.ProductID"), 0).ToString() %>'

在代码中添加一个函数来处理DBNull:

protected object CheckIfValueIsNull(object value, object nullValue)
{
    return value != DBNull.Value ? value : nullValue;
}