Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > DataBinding ComboBox


Автор: avlzll 27.12.2009, 05:00
Приветствую.

Имеется форма на которой расположен комбобокс и куча всяких текстбоксов.

Комбобокс заполнен данными из БД так:

Код

        private DataViewManager dviewmanager;       

                    MySqlCommand cmCars = new MySqlCommand("SELECT *  FROM car", connection);
                    daCars = new MySqlDataAdapter(cmCars);

                    daCars.TableMappings.Add("Table", "car");
                    daCars.Fill(ds, "car");

                    this.dviewmanager = ds.DefaultViewManager;                    
                    this.comboBox1.DataSource = this.dviewmanager;
                    this.comboBox1.DisplayMember = "car.carRegNum";


Соответственно при смене значения в комбобоксе данные во всех текстбоксах на форме тоже меняются:

Код

                    this.textBox1.DataBindings.Add("Text", this.dviewmanager, "car.carRegNum");
                    this.textBox2.DataBindings.Add("Text", this.dviewmanager, "car.carVIN");

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

 
На этой же форме я прикрутил кнопку "Очистить все поля", которая делает всем полям .Text = string.Empty; и кнопку "Добавить новую запись".

Код

using (MySqlConnection connection = new MySqlConnection(GetConnectionString()))
                {
                    try
                    {
                        connection.Open();
                        string queryString = "INSERT INTO car (carRegNum, carVIN) VALUES (@carRegNum, @carVIN)";
                        MySqlCommand cmd = new MySqlCommand(queryString, connection);

                        cmd.Parameters.Add("@carRegNum", MySqlDbType.VarChar, 7);
                        cmd.Parameters["@carRegNum"].Value = textBox1.Text;

                        cmd.Parameters.Add("@carVIN", MySqlDbType.Int32);
                        cmd.Parameters["@carVIN"].Value = Convert.ToInt32(textBox2.Text);

                        cmd.CommandType = CommandType.Text;
                        cmd.ExecuteNonQuery();

                        DataRow anyRow = ds.Tables["car"].NewRow();

                        anyRow["carRegNum"] = textBox1.Text;
                        anyRow["carVIN"] = textBox2.Text;

                        ds.Tables["car"].Rows.Add(anyRow);
                    }
                }



Проблема. Чтобы добавить новую запись надо нажать на Очистку(этот самый комбобокс тоже очищается), ввести значения и нажать на "Добавить". Но когда я после очистки ввожу данные программа все еще думает (и вполне справедливо, кстати), что я изменяю информацию о выбранном в комбобоксе итеме. INSERT в саму базу то проходит без проблем, а вот в датасете получается две одинаковых записи, одна, которая была добавлена кодом из кнопки "Добавить", и вторая, которая получилась затиранием той, которая была выбрана в комбобоксе. Не имею ни малейшего представления как сбросить этот databinding со всех полей на время по-нормальному. В этом загвоздка.
После поиска в сети есть предложения: а) добавить пустую строку в сам датасет руками, б) добавить пустую запись непосредственно в бд 
Эти варианты особо не подходят, т.к. есть еще DataGridView, в котором отображены те же самые данные, и пустая строка там будет выглядеть немного странно, плюс ко всему среди вводимых данных есть еще два внешних ключа, которые естественно not null. В общем...

Если кто понял, что я имел ввиду, то может пнете в нужном направлении. А то я уже дошел до того, что придумал в качестве выхода из этой ситуации наплодить еще такиж же точно текстбоксов и на время "Добавления" делать их видимыми, а те, которые были до этого  - невидимыми.  smile 



Автор: avlzll 27.12.2009, 12:59
Решил тем, что стал сбрасывать Binding со всех полей перед добавлением
Код

this.textBox1.DataBindings.Clear();


и восстанавливать его после.

Криво, конечно, но вроде работает как надо сейчас.

Автор: thomas 27.12.2009, 13:40
avlzll, 
Приветствую.
Раз вы работаете с DataSet, то рекомендую обратить внимание на этот http://msdn.microsoft.com/ru-ru/library/system.data.common.dataadapter.update.aspx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)