Почему элементы ComboBox должны быть повторно выбраны, чтобы получить значение? - PullRequest
1 голос
/ 14 марта 2012

Я использую ext.net 1.3 элементы управления в моем приложении ASP.NET 4.0.У меня есть несколько элементов управления ComboBox в моей веб-форме.Страница должна выполнять две задачи: Вставить и Обновить.При сохранении новой записи проблем не возникает, но когда я пытаюсь заполнить элементы управления ComboBox существующими значениями базы данных, появляются различные проблемы.Больше всего беспокоит это:

ComboBox отображает текст из базы данных, но он не заполняется, и я не могу выбрать значение ComboBox Value Member.Это потому, что он не заселен.Я написал код для заполнения ComboBox в событии загрузки страницы.

Я использую этот код, чтобы выбрать значение из базы данных и показать его в ComboBox:

string Query = "SELECT CustName FROM CustomerMaster WHERE CustID = " + Session["CustomerID"];

var result = DB.Single<Customer>(Query);
CustomerComboBox.setValue = result.CustName;

Этот код успешнополучает имя клиента и отображается в ComboBox.Чего он не делает, так это того, что он не выбирает из списка элементов ComboBox и не заполняет ComboBox.

Если я пытаюсь извлечь значение элемента текста, используя:

CustomerComboBox.SelectedItem.Value;

это выдает ошибку.

Чтобы заставить его работать, мне нужно снова щелкнуть ComboBox, чтобы заполнить его, а затем вручную выбрать то же имя клиента из списка, чтобы выбрать значение.

Как избавиться от этой проблемы?

- отредактировано -

Код для заполнения ext.net ComboBox такой:

   public void FillExtComboList(string ParameterFlag, ComboBox  DropDownName)
    {
        string Query = "";
        using (TransactionScope transactionScope = new TransactionScope())
        {
            using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["cncustomer"].ConnectionString.ToString()))
            {
                con.Open();
                SqlDataReader dr;
                try
                {
                    if (ParameterFlag == "Customer")
                    {
                        Query = "SELECT CustName FROM CustomerMaster";
                    }
                    //Check whether the Drop Down has existing items. If YES, empty it.
                    if (DropDownName.Items.Count > 0)
                        DropDownName.Items.Clear();

                    SqlCommand cmd = new SqlCommand(Query, con);
                    dr = cmd.ExecuteReader();

                    while (dr.Read())
                    {
                        Ext.Net.ListItem extLI = new Ext.Net.ListItem();
                        extLI.Text = dr[0].ToString();
                        DropDownName.Items.Add(extLI);
                    }

                    dr.Close();
                    con.Close();
                }
                catch (Exception ex)
                {
                    con.Close();
                   // RunCustomScript("alert('" + ex.Message.ToString() + "')", callingPageObjectName);
                }
            }   /* End of SQL Connection */
            transactionScope.Complete();
        }   /* End of Transaction Scope */
    }

При событии загрузки страницы элемент управления ComboBox заполняется указанным выше методом.

Ответы [ 2 ]

0 голосов
/ 15 марта 2012

Если я правильно вас понял, попробуйте этот код:

protected void Page_Load(object sender, EventArgs e) {
        FillExtComboList(DropDownName);

        // Set value that you want
        DropDownName.SetValueAndFireSelect("Test 3");
    }

    public void FillExtComboList(ComboBox DropDownName) {
        try {

            //Check whether the Drop Down has existing items. If YES, empty it.
            if (DropDownName.Items.Count > 0)
                DropDownName.Items.Clear();


            for (int i = 0; i < 10; i++) {
                Ext.Net.ListItem extLI = new Ext.Net.ListItem();
                extLI.Text = "Test " + i;
                DropDownName.Items.Add(extLI);
            }   
        } catch (Exception ex) {
            // RunCustomScript("alert('" + ex.Message.ToString() + "')", callingPageObjectName);
        } /* End of Transaction Scope */
    }
0 голосов
/ 14 марта 2012

Я не вижу инструкции для заполнения поля со списком, только для установки его выбранного значения. Не пропустили ли вы CustomerComboBox.DataSource = someList или что-то в этом роде?

<- РЕДАКТИРОВАТЬ ->

Извините, я думал, что setValue - это код загрузки вашей страницы ... ОК, это не решение вашей проблемы, а важное исправление производительности. Вы должны сделать это при загрузке комбо: при выполнении SQL-запроса:

Query = "SELECT CustID, CustName FROM CustomerMaster"

при заполнении комбо:

Ext.Net.ListItem extLI = new Ext.Net.ListItem();
extLI.Value = dr["CustId"].ToString();                         
extLI.Text = dr["CustName"].ToString();
DropDownName.Items.Add(extLI);

поэтому, когда вы хотите выбрать элемент, вы просто делаете это:

CustomerComboBox.setValue = Session["CustomerID"];

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

Теперь, не могли бы вы поделиться кодом, который вам нужен для обработки комбо-клика? Так как он заполняет комбо, он может пролить свет на нас. Также попробуйте добавить

CustomerComboBox.DataBind()

И если подумать, я вижу, что на Page_Load вы используете "DropDownName", а позже вы используете "CustomerComboBox". Может ли это быть проблемой?

...