c # связывание со списком и первое нулевое значение - PullRequest
2 голосов
/ 08 февраля 2011

У меня, вероятно, небольшая проблема, но я не могу найти обходной путь ...

У меня есть комбинированный список на форме win, и этот комбинированный список имеет привязку к столбцу в таблице данных.Этот столбец (содержит имя принтера) имеет допустимое нулевое значение.Я хочу, чтобы в выпадающем списке отображалась первая строка значений «default», а затем список принтеров.Но я не хочу, чтобы строка «по умолчанию» хранилась в datatable, просто ноль.

cmbDefaultPrinter.DataSource = this.availablePrinters;
cmbDefaultPrinter.DisplayMember = "Display";
cmbDefaultPrinter.ValueMember = "Value";

cmbDefaultPrinter.DataBindings.Add(new Binding("Text", ctr.ds.Tables[t.toTable], "printer"));

, где availablePrinters - список этого класса:

class myPrinters
{
    public string Value { get; set; }
    public string Display { get; set; }

    public myPrinters(string value, string display)
    {
        this.Value = value;
        this.Display = display;
    }
}

, а первый элемент в availablePrinters: myPrinter (null, "Принтер по умолчанию");

Что я делаю не так?

1 Ответ

1 голос
/ 08 февраля 2011

Некоторые опции:

Учитывая коллекцию объектов myPrinter, например List или связанный DataTable, вы можете просто вставить значение по умолчанию в качестве первого элемента коллекции. Затем при DataBind все текущие элементы удаляются, а новые перезагружаются с пустым элементом сверху.

Вы также можете настроить привязку данных, переопределив OnDataBound. После того, как все элементы DataTable будут добавлены, войдите и вставьте значение по умолчанию вручную.

Вы также можете отказаться от поведения DataBind по умолчанию и заполнить ComboBox самостоятельно. Я делал это много раз в случае со списком «отложенной загрузки» (где я сначала устанавливаю один элемент, который является текущим значением для записи, затем, когда они хотят опустить список, я иду, чтобы получить значения и заполнить их полностью). список). Это немного сложнее; вам нужно в основном свернуть свое собственное поведение привязки данных, используя Items.Add (). Но это не так сложно и дает вам больше гибкости, включая возможность добавлять элементы, которых нет в источнике данных.

РЕДАКТИРОВАТЬ: В этом случае (пустая строка пишется, когда вы хотите NULL), я бросил бы следующее в библиотеку методов расширения, а затем прикрепить вызов к нему в конце comboBox. SelectedValue (), когда вы извлекаете его для вставки в объект вашего домена:

public static string NullIfEmpty(this string input)
{
    return String.IsNullOrEmpty(input) ? null : input;
}

По сути, веб-элементы управления преобразуют ноль в пустую строку при настройке текста, значений или других отображаемых свойств данных, чтобы упростить их внутреннюю работу. Но они не конвертируются обратно в ноль, поэтому, если вы хотите пустую строку вместо пустой, вы должны выполнить преобразование самостоятельно. Как показывает вышеприведенный метод, это довольно просто.

...