Как я могу связать поле со списком в привязанном к данным объекте к источнику данных и все еще разрешить пустые значения? - PullRequest
1 голос
/ 27 мая 2009

У меня есть форма данных, привязанная к объекту клиента, и одно из полей является обнуляемым int, представляющим «тип». Это отображается как комбинированный список, и этот комбинированный список привязан к таблице «Типы».

Когда клиент с нулевым типом загружается в источник данных формы, в поле со списком не отображается значение, но затем, щелкнув по нему, вы должны выбрать значение. Форма / выпадающий список никогда не позволят вам вернуться обратно к пустому элементу (чтобы обозначить «ноль» на объекте клиента).

Я не хочу "фиктивных строк" в базе данных, и в настоящее время делаю это, добавляя фиктивный объект и обнуляя его в событии отправки (не чистом!).

Можно ли сделать это чисто, придерживаясь обнуляемого первичного ключа?

Ответы [ 3 ]

0 голосов
/ 10 сентября 2009

Дополнительные ссылки и ресурсы, относящиеся к обнуляемой привязке данных:

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

У Джеза Хамбла есть некоторая информация о связывании обнуляемых типов в нижней части этого поста и в комментариях Там, где он предлагает связывание с обнуляемыми типами, выполнимо, если «вы явно установите DataSourceUpdateMode в DataSourceUpdateMode.OnPropertyChanged».

Еще одна статья о типах данных Nullable: Радость кода - Типы данных и Nullable в WinForms.NET

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

Также проверьте Дэн Ханнан на предмет источника моего метода расширения.

/// <summary>
    /// From BReusable
    /// </summary>
    /// <param name="dtp"></param>
    /// <param name="dataSource"></param>
    /// <param name="valueMember"></param>
    /// <remarks>With help from Dan Hanan at http://blogs.interknowlogy.com/danhanan/archive/2007/01/21/10847.aspx</remarks>
    public static void BindNullableValue(this DateTimePicker dateTimePicker, BindingSource dataSource, String valueMember,bool showCheckBox)
    {
        var binding = new Binding("Value", dataSource, valueMember, true);

        //OBJECT PROPERTY --> CONTROL VALUE
        binding.Format += new ConvertEventHandler((sender, e) =>
        {
            Binding b = sender as Binding;

            if (b != null)
            {
                DateTimePicker dtp = (binding.Control as DateTimePicker);
                if (dtp != null)
                {
                    if (e.Value == null)
                    {

                        dtp.ShowCheckBox = showCheckBox;
                        dtp.Checked = false;

                        // have to set e.Value to SOMETHING, since it's coming in as NULL
                        // if i set to DateTime.Today, and that's DIFFERENT than the control's current
                        // value, then it triggers a CHANGE to the value, which CHECKS the box (not ok)
                        // the trick - set e.Value to whatever value the control currently has. 
                        // This does NOT cause a CHANGE, and the checkbox stays OFF.

                        e.Value = dtp.Value;

                    }
                    else
                    {
                        dtp.ShowCheckBox = showCheckBox;
                        dtp.Checked = true;
                        // leave e.Value unchanged - it's not null, so the DTP is fine with it.
                    }

                }

            }
        });
        // CONTROL VALUE --> OBJECT PROPERTY
        binding.Parse += new ConvertEventHandler((sender, e) =>
        {
            // e.value is the formatted value coming from the control. 
            // we change it to be the value we want to stuff in the object.
            Binding b = sender as Binding;

            if (b != null)
            {
                DateTimePicker dtp = (b.Control as DateTimePicker);
                if (dtp != null)
                {
                    if (dtp.Checked == false)
                    {
                        dtp.ShowCheckBox = showCheckBox;
                        dtp.Checked = false;
                        e.Value = (Nullable<DateTime>)null;
                    }
                    else
                    {
                        DateTime val = Convert.ToDateTime(e.Value);
                        e.Value = val;
                    }
                }
            }
        });
        dateTimePicker.DataBindings.Add(binding);

    }
0 голосов
/ 15 мая 2013

Если ваша основная цель - восстановить комбинированный список пустым, а значение - пустым, просто нажмите Ctrl + 0 при редактировании строки.

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

0 голосов
/ 28 мая 2009

Источник данных, который используется для привязки к комбо-типу, может содержать еще 1 запись со значением NULL.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TypeID   Name
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1        Business
2        Government
-1       NULL

Вы можете сохранить -1 для клиента, у которого нет типа (если разрешено, чтобы у клиента не было типа).

...