Как использовать Bind () в EditItemTemplate для обнуляемого свойства? - PullRequest
4 голосов
/ 11 августа 2011

У меня есть GridView, связанный с каким-либо источником данных Entity. Редактирование включено. Объект, показанный в 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 и в любом случае Product равно null. Я добавил пустой элемент в DropDownList, который следует выбирать, когда на машине нет товара. А также, если я редактирую машину с продуктом и выбираю этот элемент, столбец должен быть обнулен.

Как мне этого добиться?

Ответы [ 4 ]

3 голосов
/ 12 августа 2011

Я получил его на работу сейчас. GridView автоматически преобразует нули в пустые строки, поэтому проблема была не в привязке, а в специальном элементе, который я добавил для нулевых значений.

Изменение

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

до

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

решил проблему мгновенно ...

1 голос
/ 11 августа 2011

Вы можете использовать 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;
    }
0 голосов
/ 12 августа 2011

Хорошо, сделайте снимок:

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

Добавьте в свой код функцию для обработки DBNull:

protected object CheckIfValueIsNull(object value, object nullValue)
{
    return value != DBNull.Value ? value : nullValue;
}
0 голосов
/ 11 августа 2011

Дайте этому шанс:

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

Очевидно, замените 0 на то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...