2011-02-08 3 views
2

я получил, вероятно, есть небольшая проблема, но не могу найти обходной путь ...C# выпадающего связывание и первое нулевое значение

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

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 (нуль, "Принтер по умолчанию");

Что я делаю неправильно?

+0

Что происходит, когда вы запускаете его? – recursive

+0

в качестве значения для принтера, когда выбрана опция «по умолчанию», пустая строка хранится в ноль от нуля ... – Ray

+0

Вы можете создать метод расширения NullIfEmpty() и приклеить его, когда вы получите SelectedValue выпадающего списка. – KeithS

ответ

1

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

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

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

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

EDIT: В этом случае (пустая строка записывается, когда вы хотите, NULL), я бы бросить следующее в библиотеку метода расширения, а затем приклеить вызов к нему на конце comboBox.SelectedValue() когда вы извлечение его вставить в ваш объект домена:

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

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

+0

Извините, моя ошибка, потому что я не писал, что это за эффект - данные, хранящиеся в базе данных, являются пустой строкой, когда вместо значения null выбрано значение по умолчанию. – Ray

+0

Спасибо за сообщение, но я только что нашел, что в решении используется System.DBNull.Value, который не такой, как обычный null. Это, однако, требует бит другого кода, потому что System.DBNull.Value не может быть записана в строковую переменную, но может быть задан в объекте столбца ADO.NET. В любом случае, спасибо за ваше время! – Ray

+0

@Ray Как вы решили это. У меня такая же проблема. .. Охота на все для преобразования моего столбца DataTable из int в int? так что это займет DBNull. – eddyparkinson

Смежные вопросы