我有GridView
绑定到某个实体数据源。编辑已启用。 GridView中显示的实体与另一个实体相关联。假设我正在显示Machines
正在创建Products
(每台机器没有或一种产品类型)。我正在使用
<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
,无论如何Product
是null
。我在DropDownList中添加了空项,当机器没有产品时应该选择它。此外,如果我使用产品编辑机器并选择此项目,则列应该为空。
我怎样才能做到这一点?
答案 0 :(得分:3)
我现在就开始工作了。 GridView
会自动将空值转换为空字符串,因此问题不在于绑定,而在于我为空值添加的特殊项目。
更改
<asp:ListItem Text="" Value="0"></asp:ListItem>
到
<asp:ListItem Text="" Value=""></asp:ListItem>
立即解决了问题......
答案 1 :(得分:1)
您可以使用GridView's events
或RowDataBound
等RowEditing
。其中一种方法是:
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;
}