Как привязать к выпадающему списку без значения - PullRequest
0 голосов
/ 12 апреля 2009

Я написал некоторый код для массового обновления gridview. В gridview одно из моих полей шаблона имеет выпадающий список:

<asp:DropDownList ID="DDLCategories" runat="server" 
  DataSourceID="odsCategories" DataTextField="txtCategory" 
  DataValueField="intCategoryID" SelectedValue='<%# Bind("intCategoryID") %>'>
  <asp:ListItem Text="Please Select an item" Value ="-1"></asp:ListItem>
</asp:DropDownList>

В моей базе данных 800 записей. Однако только нескольким из них было присвоено значение «intCategoryID». Остальные NULL.

Вся причина массового обновления заключается в обновлении всех полей «intCategoryID» и назначении идентификатора категории для каждой записи.

Поскольку не всем "intCategoryID" присвоено значение, я получаю сообщение об ошибке при попытке отобразить страницу. Выпадающий список не работает. Вот сообщение:

'DDLCategories' has a SelectedValue which is invalid because it does not exist in the list of items.
Parameter name: value 

Можно ли назначить пустые категории элементу списка со значением «-1», который я создал в раскрывающемся списке? IE Если «intCategoryID» ISNULL, выберите «Пожалуйста, выберите элемент», в противном случае выберите выбранное значение.

Ответы [ 4 ]

0 голосов
/ 14 апреля 2015

Чтобы решить эту проблему, вы можете создать собственный серверный элемент управления DropdownList.

using System.Web.UI.WebControls;

namespace CustomNamespace
{
    // Dropdownlist which does not throw an exception if SelectedValue does not exist
    public class CustomDropdownList : DropDownList
    {
        protected override void PerformDataBinding(System.Collections.IEnumerable dataSource)
        {
            try
            {
                base.PerformDataBinding(dataSource);
            }
            catch (System.ArgumentOutOfRangeException)
            {
            }
        }
    }
}

Затем используйте пользовательский выпадающий список на странице aspx. Если ваш проект назывался «CustomProject», добавьте это во второй строке aspx-файла:

<%@ Register assembly="CustomProject" namespace="CustomNamespace" tagprefix="custom" %>

Затем замените все экземпляры тега DropdownList на пользовательский:

<custom:CustomDropdownList ID="ddlId" runat="server" SelectedValue='<%# Bind("column") %>' DataSourceID="dataSourceDropdown" DataTextField="field" DataValueField="value" />
0 голосов
/ 12 апреля 2009

Я пытался преобразовать код, который вы указали мне, однако я все еще плохо знаком с C # и ASP.NET, поэтому у меня есть некоторые ошибки.

Код, который вы указали, относится к виду формы, однако я пытаюсь изменить его на вид сетки.

Вот мой код:

protected void GridView1_PreRender(object sender, EventArgs e)
    {
        DataRowView rowView = (DataRowView)(GridView1.DataItem);
        if ((rowView != null) &&
            ((DropDownList)(GridView1.FindControl("DDLCategories")).Items.FindByValue(rowView["intCategoryID"].ToString()) != null));
        {
            (DropDownList)(GridView1.FindControl("DDLCategories")).SelectedValue = rowView["Category"].ToString();
        }
    }



protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e)
{
    e.NewValues["intCategoryID"] = (DropDownList)(GridView1.FindControl("DDLCategories")).SelectedValue;
}

Не могли бы вы указать, когда я создаю ошибки.

0 голосов
/ 11 декабря 2013

Самый простой способ - разрешить AppendDataBoundItems и добавить целое число, соответствующее нулю. Он может иметь значение «-1» или любое другое значение, которого нет в списке значений. Теперь все, что вам нужно сделать, это создать условную привязку:

(Eval("intCategoryID") != null && Eval("intCategoryID").ToString().Length>0) ? Eval("intCategoryID").ToString() : "-1"
0 голосов
/ 12 апреля 2009

Проверить это сообщение . Он переопределяет метод привязки для DDL и проверяет отсутствующее SelectedValue. Возможно, вам придется изменить его, если вы не используете FormView, но я думаю, что вы начнете с этого поста.

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