Использование ComboBox.Text, когда комбобокс привязан к DataSource - PullRequest
2 голосов
/ 16 ноября 2011

У нас есть проект, который устанавливает DataSource комбинированного списка, но позволяет пользователям либо выбрать что-то из этого списка, либо ввести элемент, которого нет в списке. По сути, есть Geobase, которая содержит улицы, но пользователи не обязаны выбирать улицу из списка. ComboBox.DropDownStyle имеет значение DropDown.

Если пользователь редактирует запись, которая содержит улицу НЕ в геобазе (и, следовательно, не в ComboBox.DataSource), у нас возникают проблемы с заполнением формы правильно.

Вот очень упрощенная форма нашей задачи:

    private void button1_Click(object sender, EventArgs e)
    {
        // Create a new form.  In the constructor the DataSource of the ComboBox is set with three items:
        //      Main St., First St., and Second St.
        ComboBoxTrialForm frm = new ComboBoxTrialForm();

        // Set comboBox1.Text equal to an item NOT in the datasource
        frm.SetComboTextValue("Michigan Ave.");

        // Show the form, and the comboBox has the first item in its datasource selected
        frm.Show();
    }

Класс ComboBoxTrial работает примерно так:

public partial class ComboBoxTrialForm : Form
{
    public ComboBoxTrialForm()
    {
        InitializeComponent();
        List<string> streets = new List<string>() { "Main St.", "First St.", "Second St." };
        comboBox1.DataSource = streets;
    }

    public void SetComboTextValue(string text)
    {
        comboBox1.Text = text;
    }
}

Я установил точки останова и обнаружил, что comboBox1.Text действительно настроен правильно. Интересно, что я обнаружил, что событие BindingContextChanged фактически запускается дважды в этом упрощенном примере. Один раз в конструкторе, когда вызывается comboBox1.DataSource = streets, и второй раз, когда вызывается frm.Show().

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

Кроме того, я ошибаюсь, полагая, что я должен быть в состоянии использовать комбинированный список таким образом?

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 16 ноября 2011

Вы должны иметь возможность установить SelectedIndex на -1, чтобы ни один элемент не был выбран в списке. У меня не было проблем с получением "Мичиган-авеню". для отображения в поле со списком с этим методом.

public Form1()
{
    InitializeComponent();
    comboBox1.DataSource = new List<string>() { "Main St.", "First St.", "Second St." };
    comboBox1.SelectedIndex = -1;
}

Кроме того, вы можете показать форму, а затем установить текст. Если это не проблема, пользователь, вероятно, не заметит.

    frm.Show();
    frm.SetComboTextValue("Michigan Ave.");
1 голос
/ 16 ноября 2011

Я не могу вспомнить ни одного случая в нашем коде winforms, где мы устанавливаем источник данных в конструкторе, поэтому я не могу понять, почему вы видите то, что видите.

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

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

Этот шаблон также невероятно полезен, если форма решает, что его не следует показывать по какой-то причине (открылась другая форма того же типа, произошла ошибка при доступе к ресурсам, используемым формой, пользовательне имеет соответствующих разрешений и т. д.).

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

В вашем случаемы переписали бы вашу форму следующим образом:

public partial class ComboBoxTrialForm : Form
{
    public ComboBoxTrialForm()
    {
        InitializeComponent();
    }

    public void ShowForm(string comboBoxValue)
    {
        this.Show();

        List<string> streets = new List<string>() { "Main St.", "First St.", "Second St." };
        comboBox1.DataSource = streets;

        SetComboTextValue(comboBoxValue);
    }

    public void SetComboTextValue(string text)
    {
        comboBox1.Text = text;
    }
}

Ваше событие button1_click станет:

private void button1_Click(object sender, EventArgs e)
{
    // Create a new form.  In the constructor the DataSource of the ComboBox is set with three items:
    //      Main St., First St., and Second St.
    ComboBoxTrialForm frm = new ComboBoxTrialForm();

    // Show the form, and the comboBox has the first item in its datasource selected
    frm.ShowForm("Michigan Ave.");
}
0 голосов
/ 16 ноября 2011

вместо выпадающего списка, почему бы не использовать службу Windows WCF, которая вызывается, когда пользователь вводит текстовое поле. Таким образом, вы можете использовать текстовое поле, но при этом дать пользователю возможность выбрать нечто похожее из базы данных

Это должно дать вам код для службы Windows

http://wcftutorial.net/WCF-Windows-Service-Hosting.aspx

http://msdn.microsoft.com/en-us/library/bb332338.aspx

И вы могли бы вызвать его из события keyup.

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