Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > ComboBox + dataBinding???


Автор: shark1 6.11.2008, 00:54
Подскажите плиззз,вот так заполняю combobox,
Код :
Код

conn1 = new OleDbConnection();
                    conn1.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Data\\Client_DB.mdb";
                    //create data adapter
                    adapter1 = new OleDbDataAdapter("SELECT DISTINCT ClientName FROM  TBL_Clients", conn1);
                     //Create a Dataset
                    ds1=new DataSet();
                    dataTable1 = ds1.Tables.Add("Clients");
                    adapter1.Fill(ds1, "Clients");

                    cmb_ClientName.DataSource = ds1.Tables["Clients"];
                    cmb_ClientName.DisplayMember = "ClientName";
                    cmb_ClientName.ValueMember = "ClientName";
                    cmb_ClientName.SelectedIndex = -1;

А теперь как сделать,чтоб при выборе чего нибудь из combobox-а в соответствии заполнялись информацией textbox-ы.
Вот например в datagridview если я делаю так :
Код

this.txt_CompNameNew.DataBindings.Add("Text", dataTable, "CompanyName", true, DataSourceUpdateMode.OnPropertyChanged);                   
                  this.txt_CompNameMail.DataBindings.Add("Text", dataTable, "CompanyName", true, DataSourceUpdateMode.OnPropertyChanged);                    
                    this.txt_ClientNameMail.DataBindings.Add("Text", dataTable, "ClientName", true, DataSourceUpdateMode.OnPropertyChanged);

то все работает.
А как такоеже сделать с combobox-ом.Зарание спасибо. 

Автор: Bogdan1024 6.11.2008, 01:59
Ну. На событии SelectedIndexChanged тяни данные и записывай их в текстбоксы. Не?

Автор: shark1 6.11.2008, 02:46
А как тянуть то smile ???

Автор: Nestap 6.11.2008, 10:21
shark1

а не лехче исползуть DataReader чем адаптер?


Автор: jorikdima 6.11.2008, 15:54
Цитата(shark1 @ 6.11.2008,  02:46)
А как тянуть то smile ???

Зная индекс, знаешь ряд в таблице.

Автор: informatik 6.11.2008, 16:39
Вообще все должно также работать...

Только в запрос нужно включать те поля которые вы хотите отображать в текстбоксах..

Автор: shark1 7.11.2008, 00:52
киньте примерчик.Спасибо.

Автор: informatik 7.11.2008, 08:09
Код

         SqlConnection con = new SqlConnection("Строка подключения");
            SqlCommand cmd = new SqlCommand("SELECT PK, NAME, FNAME FROM Таблица",con);
            SqlDataAdapter da = new SqlDataAdapter(cmd);

            DataSet ds = new DataSet("DS");
            ds.Tables.Add("Table");

            da.Fill(ds.Tables["Table"]);

            comboBox1.DataSource = ds.Tables["Table"];
            comboBox1.DisplayMember = "NAME";
            comboBox1.ValueMember = "PK";

            textBox1.DataBindings.Add("Text",ds.Tables["Table"],"PK");
            textBox2.DataBindings.Add("Text",ds.Tables["Table"],"NAME");
            textBox3.DataBindings.Add("Text",ds.Tables["Table"],"FNAME");

Автор: shark1 7.11.2008, 09:02
Спасибо большое я попробовал,и вот выдаёт такую ошибку :
"System.ArgumentException was unhandled
  Message="Cannot bind to the property or column CompanyName on the DataSource.\r\nParameter name: dataMember"
Код:
Код

conn1 = new OleDbConnection();
                    conn1.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Data\\Client_DB.mdb";
                    command1 = new OleDbCommand("SELECT DISTINCT  ClientName FROM  TBL_Clients", conn1);
                    adapter1 = new OleDbDataAdapter(command1);

                    ds1 = new DataSet("DS");
                    ds1.Tables.Add("NewClients");

                    adapter1.Fill(ds1.Tables["NewClients"]);

                    cmb_ClientName.DataSource = ds.Tables["NewClients"];
                    cmb_ClientName.DisplayMember = "ClientName";
                    cmb_ClientName.ValueMember = "ID";

                    
                    this.txt_CompNameNew.DataBindings.Add("Text", ds1.Tables["NewClients"], "CompanyName");

Подскажите в чём причина.
Mожет в запросе,но мне нужно делать так "SELECT DISTINCT  ClientName FROM  TBL_Clients" потому что в Базе есть повторяющиеся ClientName,а так запрос их сортирует и убирает дубликаты.Спасибо.

Автор: informatik 7.11.2008, 09:18
Я же вам говорил что нужно включать в запрос поля которые хотите отображать! А как иначе то? Чтобы посмотреть данные их нужно получить.

Напишите вот так
Код

command1 = new OleDbCommand("SELECT DISTINCT  ClientName, CompanyName, ID FROM  TBL_Clients", conn1);


Загружать нуно все поля которые используете..

Автор: shark1 7.11.2008, 09:39
Ok,я поменял строку запроса
Код

conn1 = new OleDbConnection();
                    conn1.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Data\\Client_DB.mdb";
                    command1 = new OleDbCommand("SELECT DISTINCT ClientName, CompanyName, ID   FROM  TBL_Clients", conn1);
                    adapter1 = new OleDbDataAdapter(command1);

                    ds1 = new DataSet();
                    ds1.Tables.Add("NewClients");

                    adapter1.Fill(ds1.Tables["NewClients"]);

                    cmb_ClientName.DataSource = ds.Tables["NewClients"];
                    cmb_ClientName.DisplayMember = "ClientName";
                    cmb_ClientName.ValueMember = "ID";

                    this.textBox2.DataBindings.Clear();
                    textBox2.DataBindings.Add("Text", ds1.Tables["NewClients"], "ID");
                    this.txt_CompNameNew.DataBindings.Clear();
                    this.txt_CompNameNew.DataBindings.Add("Text", ds1.Tables["NewClients"], "CompanyName");
                    this.cmb_ClientName.DataBindings.Clear();
                    this.cmb_ClientName.DataBindings.Add("Text", ds1.Tables["NewClients"], "ClientName");

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

Автор: thomas 7.11.2008, 09:50
shark1
Приветик.
Я лично комбобоксы в цикле заполняю.
Код

//invullen ComboBoxen 
foreach (DataRow dr in ds.Tables["klanten"].Rows)
{
    cmbKlant.Items.Add(dr["Naam klant"]); 
}

Т.е. из БД в таблицу ДатаСет считываю данные, а потом из колонки имена клиентов беру имена, в цикле пробегаюсь по строкам и заношу данные в комбо бокс.
Все.

Удачи.  smile  

Автор: shark1 7.11.2008, 10:12
Я с этим разобрался,теперь вижу всех,но Что то не так как надо.Например я добавил трёх клиентов.
Например:
name :1
compname:1
name:2
compname:2
name:3
comppname:3
вопервых получаю срау в combobox последнюю запись и соответственно в textbox_comname бандинг.Но вот если я выбираю какую то запись из combobox-а ,то одна из трех теряется(исчезает),а выбранных становится две :(,что за ....Спасибо.
Неувидел thomas кинь примерчик плиззз.Спасибо.

Автор: informatik 7.11.2008, 10:18
Код

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


Если так происходит, то возможно все ваши значения во всех строках таблицы идентичны даже по ID, что неприемлемо(по ID).

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

И т.к. вы хотите выбрать не повторяющиеся значения по полю ClientName (хотя судя по названию поля в выборе не повторяющихся значений по нему не вижу смысла).


Возможно вы показываете не весь код и ошибка где то за пределами мной увиденного....

Добавлено через 10 минут и 23 секунды
Цитата

вопервых получаю срау в combobox последнюю запись и соответственно в textbox_comname бандинг.Но вот если я выбираю какую то запись из combobox-а ,то одна из трех теряется(исчезает),а выбранных становится две :(,что за ....Спасибо.


Думаю теперь можно практически на 100% быть уверенным что ошибка не в том коде который вы представляете...

Автор: shark1 7.11.2008, 10:37
Хм :( вот весь код,
Код

private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
        {
            try
            {

                if (tabControl1.SelectedTab == tabPage2)
                {                    
                    /////
                    ///// Fill ComboBox
                    /////
                    conn1 = new OleDbConnection();
                    conn1.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Data\\Client_DB.mdb";
                    command1 = new OleDbCommand("SELECT DISTINCT ClientName, CompanyName, ID   FROM  TBL_Clients", conn1);
                    adapter1 = new OleDbDataAdapter(command1);

                    ds1 = new DataSet("DS");
                    ds1.Tables.Add("NewClients");

                    adapter1.Fill(ds1.Tables["NewClients"]);

                    cmb_ClientName.DataSource = ds1.Tables["NewClients"];
                    cmb_ClientName.DisplayMember = "ClientName";
                    cmb_ClientName.ValueMember = "ID";
                   

                    //cmb_ClientName.SelectedIndex = -1;

                    //this.textBox2.DataBindings.Clear();
                    this.textBox2.DataBindings.Add("Text", ds1.Tables["NewClients"], "ID");
                    //this.cmb_ClientName.DataBindings.Clear();
                    this.cmb_ClientName.DataBindings.Add("Text", ds1.Tables["NewClients"], "ClientName");
                    //this.txt_CompNameNew.DataBindings.Clear();
                    this.txt_CompNameNew.DataBindings.Add("Text", ds1.Tables["NewClients"], "CompanyName");
                    
                  }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

другого нет

Автор: informatik 7.11.2008, 11:01
Цитата

то одна из трех теряется(исчезает),а выбранных становится две 


Ну поймите не может этого быть просто так..

Может ваш ComboBox подписан на какое то событие, которое и вызывает такую проблему...

Просмотрите ваш код внимательнее, а еще убедитесь все ли вы сами понимаете в своем коде, (без обид)

Автор: shark1 7.11.2008, 11:38
Да какие уж тут обиды,если бы я всё понимал я бы неспрашивал.Но вы как всегда оказались правы на 1000%.Я же баран засунул в бандинг и комбобокс.Я извеняюсь,просто невнимательность + незнание = ......
И напоследок маленький штрих,почему "SELECT DISTINCT ClientName,CompanyName,ID FROM TBL_Clients" не работает,если я например добавил клиента с тем же именем,то я вижу две записи в комбобоксе.Спасибо.

Добавлено через 14 минут и 33 секунды
Вот ...,ну как же побороть двойные записи ? :(

Автор: informatik 7.11.2008, 13:30
Да. Есть такая проблема в вашем случае.. Заключается она в том что, если даже CompanyName одинаковые, но всеравно ID то разные у всех записей...

Выборку конечно такую можно сделать, но СМЫСЛ???

ClientName - как я понимаю Имя клиента и наверно полное, т.е. ФИО..

Зачем неповторяющиеся данные по этому полю...

Каждый клиент должен быть УНИКАЛЬНЫМ...

СМЫСЛ так выбирать данные мне непонятен

По сути если у вас есть два Ивана Ивановича, то один из них вам нафиг ненужен....



Автор: shark1 7.11.2008, 18:00
smile обьясню для чего,потому что у каждого клиента есть поле о сделанной для него работе,так вот хотелось сделать так чтоб все поля бандились,а только поле о сделанной работе заполнялось по новой,и тогда в базе будет видно у клиента с одинаковым именем будет видно сколько (много) работ было сделано.Спасибо.

Добавлено через 2 минуты и 3 секунды
Да и еще ClientName - ето толко имя и фамилия(и фамилия иногда)

Автор: informatik 7.11.2008, 18:56
Цитата

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


Ничего толком непонятно... но думаю у вас еще проблема с проектированием БД....

Автор: shark1 7.11.2008, 19:10
smile Ну смотри есть форма через кот.добовляется информация в базу.На форме:
ClientName(ComboBox)
CompanyName(textBox)
...
DoneWork(textBox)
так вот,например если клиент вернулся,то я не хочу заполнять все поля заново,хочу чтоб они бандились,а только поле DoneWork заполняю поновой,и сохроняю,и так в базе есть тот же клиент но с разной сделанной работой (для него).Спасибо.

Автор: shark1 7.11.2008, 22:47
А какая может быть проблемма с базой.Есть одна таблица и в ней вся информация о клиентах и сделанной для них работ ???

Автор: shark1 8.11.2008, 12:03
Или может подскажите как разделить правильно базу,чтоб в моём случае помогло.
Вот структура базы:
Category    
ClientName    
CompanyName    
Address    
City    
PostalCode    
Telephone    
Fax    
Cell    
Email    
InsertDate    
Price    
Photo    
History    
Link    
ID
Спасибо.

Автор: Partizan 8.11.2008, 13:19
shark1, Вы описание предметной области выложите, а не структуру вашей единственной таблицы...

Добавлено через 2 минуты и 11 секунд
Цитата

А какая может быть проблемма с базой.Есть одна таблица и в ней вся информация о клиентах и сделанной для них работ ???


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

Автор: informatik 8.11.2008, 18:32
Да уже ясно что как минимум две таблицы..

1. Клиенты
2. Работы

Между ними связь 1-M (Работа M-1 Клиент)

Вот в этом то у вас и проблема..
Потом можно будет написать нужный вам запрос...

Но думаю вам действительно надо почитать про Проектирование БД, чтобы вам было все понятно, как и зачем все это нуно..smile

Добавлено @ 18:33
На форме ввода работы будет выбираться клиент для которого сделана работа, и данные о  сделаной работе..

Автор: shark1 9.11.2008, 09:58
Ok,спасибо за совет.Я разделил базу на две таблицы.TBL_Clients и TBL_ClientsWork.
TBL_Clients структура:
IDClient - ключ
ClientName
Address
City
PostalCode
Telephone
Fax
Cell
Email
InsertDate
Photo
Link
TBL_ClientsWork структура:
IDClientsWork - ключ
IDClient
Category
CompanyName
Price
History- это поле куда будет вводится инфа о проделанной работе.

Теперь подскажите как исправить команды.Например раньше я сохронял в базу  так:
Код

string qry = "Insert into TBL_Clients(Category,ClientName,CompanyName,Address,City,PostalCode,Telephone,Fax,Cell,Email,InsertDate,Price,Photo,History,Link) values(@Category,@ClientName,@CompanyName,@Address,@City,@PostalCode,@Telephone,@Fax,@Cell,@Email,@InsertDate,@Price,@Photo,@History,@Link)";
                      OleDbCommand OleDbCom = new OleDbCommand(qry, conn);
                   
                      OleDbCom.Parameters.Add(new OleDbParameter("@Category", (object)categoriesComboBox.Text));
                    //OleDbCom.Parameters.Add(new OleDbParameter("@ClientName", (object)txt_ClieNameNew.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@ClientName", (object)cmb_ClientName.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@CompanyName", (object)txt_CompNameNew.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@Address", (object)txt_AddressNew.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@City", (object)txt_CityProvNew.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@PostalCode", (object)txt_PCNew.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@Telephone", (object)txt_TelNew.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@Fax", (object)txt_Newfax.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@Cell", (object)txt_Newcell.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@Email", (object)txt_Newemail.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@InsertDate", (object)txt_InsDateNew.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@Price", (object)txt_PriceNew.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@Photo", (object)imageData));
                    OleDbCom.Parameters.Add(new OleDbParameter("@History", (object)txt_Remarks.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@Link", (object)txtImagePath.Text));



                    //Open connection and execute insert query.
                    conn.Open();
                    OleDbCom.ExecuteNonQuery();
                    conn.Close();


А как теперь поменять команду чтоб сохроняло в две таблици.Большое спасибо.

Автор: informatik 9.11.2008, 17:21
Цитата

А как теперь поменять команду чтоб сохроняло в две таблици.Большое спасибо.


В две таблицы сразу сохранять информацию нет необходимости..

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

На форме ввода работы будет выбираться клиент для которого сделана работа, и данные о  сделаной работе..

Автор: shark1 9.11.2008, 20:42
informatik а нельзя это сделать все на одной форме?Спасибо.

Автор: informatik 9.11.2008, 20:50
Цитата

informatik а нельзя это сделать все на одной форме?Спасибо.


Конечно можно, делайте как нравиться... Просто запросы нужно сделать отдельно...

Автор: shark1 10.11.2008, 02:09
Сделал вот так:
Код

OleDbConnection conn = new OleDbConnection(txtConnectionString.Text);
                    OleDbConnection conn3 = new OleDbConnection(txtConnectionString.Text);

                    //Set insert query
                    string qry = "Insert into TBL_Clients(StatusImage,ClientName,Address,City,PostalCode,Telephone,Fax,Cell,Email,InsertDate,Photo,Link) values(@StatusImage,@ClientName,@Address,@City,@PostalCode,@Telephone,@Fax,@Cell,@Email,@InsertDate,@Photo,@Link)";
                    string qry1 = "Insert into TBL_ClientsWork (Category,CompanyName,Price,History) values(@Category,@CompanyName,Price,History)";
                   

                    
                    OleDbCommand OleDbCom = new OleDbCommand(qry, conn);
                    OleDbCommand OleDbCom1 = new OleDbCommand(qry1, conn3);

                    OleDbCom.Parameters.Add(new OleDbParameter("@StatusImage", (object)imageData1));
                    OleDbCom1.Parameters.Add(new OleDbParameter("@Category", (object)categoriesComboBox.Text));
                    //OleDbCom.Parameters.Add(new OleDbParameter("@ClientName", (object)txt_ClieNameNew.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@ClientName", (object)cmb_ClientName.Text));
                    OleDbCom1.Parameters.Add(new OleDbParameter("@CompanyName", (object)txt_CompNameNew.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@Address", (object)txt_AddressNew.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@City", (object)txt_CityProvNew.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@PostalCode", (object)txt_PCNew.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@Telephone", (object)txt_TelNew.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@Fax", (object)txt_Newfax.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@Cell", (object)txt_Newcell.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@Email", (object)txt_Newemail.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@InsertDate", (object)txt_InsDateNew.Text));
                    OleDbCom1.Parameters.Add(new OleDbParameter("@Price", (object)txt_PriceNew.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@Photo", (object)imageData));
                    OleDbCom1.Parameters.Add(new OleDbParameter("@History", (object)txt_Remarks.Text));
                    OleDbCom.Parameters.Add(new OleDbParameter("@Link", (object)txtImagePath.Text));



                    //Open connection and execute insert query.
                    conn.Open();
                    conn3.Open();
                    OleDbCom.ExecuteNonQuery();
                    OleDbCom1.ExecuteNonQuery();
                    conn.Close();
                    conn3.Close();

только у меня вот такой вопрос,мне кажетса что второй insert должен быть с where,потомучто у меня в таблице TBL_ClientsWork есть поле IDClient кот должно быть связанно с таблицей TBL_Clients.Или нет ? подскажите ка должно быть сделанно where если это вообще нужно.Спасибо.

Автор: informatik 10.11.2008, 07:43
Поле IDClient для того и делалось чтобы связывать две таблицы..
В этом поле должен находиться ID клиента к которому относится данная работа (запись в таблице TBL_ClientsWork)

Вы разделение таблиц сделали, но непоняли зачем..

Вам просто необходимо почитать про проектирование БД, язык SQL и т.п.

Автор: shark1 10.11.2008, 09:35
Правильно я всё так и понял,только как записать в таблицу TBL_ClientsWork-IDClient чтоб он был идентичен IDClient из таблици TBL_Clients.Спасибо.

Автор: shark1 10.11.2008, 10:03
Почему то вот так:
string qry1 = "Insert into TBL_ClientsWork (Category,CompanyName,Price,History) values(@Category,@CompanyName,Price,History)where TBL_Clients.IDClients = TBL_ClientsWork.IDClients";
 неработает.Выдаёт ошибку:
System.Data.OleDb.OleDbException: Missing semicolon (;) at end of SQL statement.
и где мне нужно поставить ;.Спасибо.

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