Модераторы: gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка данных в comboBox из таблицы БД, как загрузить данные в comboBox? 
:(
    Опции темы
GMC
Дата 29.3.2007, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 12.12.2006

Репутация: нет
Всего: нет



При работе со справочниками возникла необходимость выборы данных из справочных таблиц, тоесть сделать выбор нужной информации из comboBox(а так же listBox). Проблема в том, чтобы загрузить все данные из таблица в comboBox(или listBox) для дальнейшего выбора нужной информации.

PM MAIL   Вверх
mr.DUDA
Дата 30.3.2007, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Вопрос слишком общий. Запрос в базу делать умеем ? Если да, получаем результат (ридером или в датасет адаптером подгружая), пробегаем по строкам результата и добавляем элементы в комбобокс/листбокс.


--------------------
user posted image
PM MAIL WWW   Вверх
GMC
Дата 30.3.2007, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 12.12.2006

Репутация: нет
Всего: нет



подключение/чтение/запись сделал, но со справочниками что то застрял.
mr.DUDA, если можно я бы хотел на код взглянуть, чтото у  меня не получается! :-( 
PM MAIL   Вверх
GMC
Дата 2.4.2007, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 12.12.2006

Репутация: нет
Всего: нет



Напишите  ктонить код или лучше пример!!!
PM MAIL   Вверх
Idsa
Дата 2.4.2007, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(GMC @  2.4.2007,  07:53 Найти цитируемый пост)
Напишите  ктонить код или лучше пример!!! 

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


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
mr.DUDA
Дата 2.4.2007, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Цитата(GMC @  2.4.2007,  06:53 Найти цитируемый пост)
Напишите  ктонить код или лучше пример!!!

http://forum.vingrad.ru/index.php?showtopi...st&p=962849


--------------------
user posted image
PM MAIL WWW   Вверх
GMC
Дата 8.4.2007, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 12.12.2006

Репутация: нет
Всего: нет



После выполения кода listbox1 остается пустым, хотя заполняется в самой функции. DataReader заполняется(returnString = ClientNAme возвращает последнюю сторку из DataReader). Как возвратить тогда все данные из DataReader? Или как то можно подругому ?


 
Код

 public static string addcombobox()
        {
            string returnString="";
                     
            string connectionString = "datasource=localhost;username=root;password=mc;database=Customer";
            using (MySqlConnection connection = new MySqlConnection(connectionString))
            {
               
                string commandText = "Select ClientName from clients";

                
                    MySqlCommand command = new MySqlCommand(commandText, connection);
                    connection.Open();
                    using (MySqlDataReader reader = command.ExecuteReader()) 
                    {
                        while (reader.Read())
                        {
                            string ClientNAme = reader.GetString(0);
                            returnString = ClientNAme;
                            ListBox listBox1 = new ListBox();
                            listBox1.Items.Add(ClientNAme);
                                                                     
                            
                        }
                       // reader.Close();
                    }

                } 
            return returnString;
        }

private void button4_Click(object sender, EventArgs e)
        {
           
           textBox2.Text= addcombobox();
           listBox1.Refresh();
          
        }

 


PM MAIL   Вверх
mr.DUDA
Дата 8.4.2007, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Цитата(GMC @  8.4.2007,  15:34 Найти цитируемый пост)
 ListBox listBox1 = new ListBox();

Лажа.


--------------------
user posted image
PM MAIL WWW   Вверх
Данкинг
Дата 8.4.2007, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: нет
Всего: 130



Цитата(mr.DUDA @ 30.3.2007,  09:50)
Вопрос слишком общий. Запрос в базу делать умеем ? Если да, получаем результат (ридером или в датасет адаптером подгружая), пробегаем по строкам результата и добавляем элементы в комбобокс/листбокс.

А других вариантов нет? Просто это хорошо для относительно небольших БД...


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
mr.DUDA
Дата 8.4.2007, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Листбокс изначально не предназначен для отображения больших объёмов данных, т.к. строки добавляются все что есть (по одной или всем скопом). Нужно копать в сторону более экономичных и быстрых датагридов (не стандартного DataGrid !), желательно с поддержкой lazy load.


--------------------
user posted image
PM MAIL WWW   Вверх
emmanuil
Дата 9.4.2007, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



Зачем цикл?

С DataReader'ом не пробовал, но с DataTable вот так:

Код

            ListBox lb; //твой ListBox
            SqlCommand command = new SqlCommand(commandText, connection);
            SqlDataAdapter da = new SqlDataAdapter(command);
            DataSet ds = new DataTable();
            connection.Open();
            da.Fill(ds);
            lb.DisplayMember = "<Название поля>"; // Это то что будет отображаться
            lb.ValueMember = "<Название поля>"; // это то что будет храниться
            lb.DataSource = ds.Tables[0].DefaultView;


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

Добавлено через 1 минуту и 3 секунды
прошу прощения:
DataSet ds = new DataSet();

PM MAIL   Вверх
GMC
Дата 9.4.2007, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 12.12.2006

Репутация: нет
Всего: нет



все равно  listBox1 остается пустым.
emmanuil, может ошибка гденить? выложи полностью код.


Код

  public static void addcombobox()
        {
                 string connectionString = "datasource=localhost;username=root;password=mc;database=Customer";
            using (MySqlConnection connection = new MySqlConnection(connectionString))
            {

                string commandText = "Select ClientName from clients";

                ListBox listBox1 = new ListBox(); ; //твой ListBox
                            
                MySqlCommand command = new MySqlCommand(commandText, connection);
                MySqlDataAdapter da = new MySqlDataAdapter(command);
                DataSet ds = new DataSet();
                connection.Open();
                da.Fill(ds);
                listBox1.DisplayMember = "ClientName"; // Это то что будет отображаться
                listBox1.ValueMember = "ClientName"; // это то что будет храниться
                listBox1.DataSource = ds.Tables[0].DefaultView;
            }
        }

private void button4_Click(object sender, EventArgs e)
        {
               addcombobox();
               listBox1.Refresh();
          
        }


PM MAIL   Вверх
GMC
Дата 9.4.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 12.12.2006

Репутация: нет
Всего: нет



все заработало после того как я передал компонент  listBox1 в addcombobox!


Код

        public void addcombobox(ListBox listBox1)
        {
            string returnString = "";

            string connectionString = "datasource=localhost;username=root;password=mc;database=Customer";
            using (MySqlConnection connection = new MySqlConnection(connectionString))
            {

                string commandText = "Select ClientName from clients";
                //ListBox listBox1 = new ListBox();

                MySqlCommand command = new MySqlCommand(commandText, connection);
                connection.Open();
                using (MySqlDataReader reader = command.ExecuteReader())
                {
                  
                    while (reader.Read())
                    {
                        string ClientNAme = reader.GetString(0);
                        returnString = ClientNAme;
                        listBox1.Items.Add(ClientNAme);
                        

                    }
                    reader.Close();
                }

            }
            
        }

    private void button4_Click(object sender, EventArgs e)
        {
            addcombobox(listBox1);
           
           listBox1.Refresh();
          
        }


Получается что он создавал виртуальный listBox1 ( ListBox listBox1 = new ListBox(), который никак не был связан с листбоксом на форме, поэтому данные и неотображались...
PM MAIL   Вверх
emmanuil
Дата 10.4.2007, 04:58 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



Да, так и есть. Если ты хотел создавать, то нужо было бы указывать Parent размеры и положение и прочее. Только как я показал было бы лучше и быстрее! ListBox своими средствами загружает данные. ValueMember указывать не обязательно. Попробуй в DataSource указать свой DataReader, тоже должно работать, а цикл делать нужно в крайнем случае, если у контрола нет возможности загрузить данные самостоятельно! Удачи!
PM MAIL   Вверх
GMC
Дата 10.4.2007, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 12.12.2006

Репутация: нет
Всего: нет



Дело в том что listBox1 у меня уже был на форме но в самой функции он был невидим, поэтому приходилось создавать его ListBox listBox1 = new ListBox(). Как сделать что бы он был видим в функции, что бы его не создавать так? 
PM MAIL   Вверх
emmanuil
Дата 10.4.2007, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



А функция к какому классу относится?
Если ты хочешь этот метод испотльзовать для многих ListBox"сов, то подавай ListBox через параметр. Если нет, то тогда параметр передовать не обязательно. Если у тебя ListBox1 и addcombobox находятся в одном классе, то просто пиши ListBox1.DataSource....
Если в разных классах, то передавай ListBox1 через свойство или сделай ListBox1 public, что не очень хорошо. А я просто дописал компонет, добавил свойства Connection, command..., метод для заполнения LoadData и все! И принеобходимости вызывал этот метод и все!

Код

using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using DevExpress.XtraEditors;
using System.Windows.Forms;

namespace CommonEditors
{
    public class CheckListBoxControl : DevExpress.XtraEditors.CheckedListBoxControl
    {
        public CheckListBoxControl()
        {
            command = new SqlCommand();
            dataBaseAdapter = new SqlDataAdapter();
            dataSet = new DataSet();
        }

        private SqlConnection connection;
        public SqlConnection Connection
        {
            get { return connection; }
            set { connection = value; }
        }

        private SqlDataAdapter dataBaseAdapter;
        public SqlDataAdapter DataBaseAdapter
        {
            get { return dataBaseAdapter; }
            //set { dataAdapter = value; }
        }

        private DataSet dataSet;
        public DataSet DataSet
        {
            get { return dataSet; }
            //set { dataSet = value; }
        }

        private SqlCommand command;
        public SqlCommand Command
        {
            get { return command; }
            set { command = value; }
        }

        private void FillDataSet()
        {
            if (connection.State == ConnectionState.Closed)
                connection.Open();
            command.Connection = connection;
            dataBaseAdapter.SelectCommand = command;
            dataSet.Clear();
            dataBaseAdapter.Fill(dataSet);
        }

        public void LoadData(String displayDataFieldName, String memberDataFieldName)
        {
            try
            {
                FillDataSet();
                this.Items.Clear();
                this.DisplayMember = dataSet.Tables[0].Columns[displayDataFieldName].Caption;
                this.ValueMember = dataSet.Tables[0].Columns[memberDataFieldName].Caption;
                this.DataSource = dataSet.Tables[0].DefaultView;
            }
            catch (Exception e)
            {
                MessageBox.Show("Произошла ошибка при заполнении списка!" + (Char)13 +
                    e.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void LoadData(int displayDataFieldIndex, int memberDataFieldIndex)
        {
            try
            {
                FillDataSet();
                this.Items.Clear();
                this.DisplayMember = dataSet.Tables[0].Columns[displayDataFieldIndex].Caption;
                this.ValueMember = dataSet.Tables[0].Columns[memberDataFieldIndex].Caption;
                this.DataSource = dataSet.Tables[0].DefaultView;
            }
            catch (Exception e)
            {
                MessageBox.Show("Произошла ошибка при заполнении списка!" + (Char)13 +
                    e.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void LoadData(SqlConnection sqlConnection, String cmdText,
            String displayDataFieldName, String memberDataFieldName)
        {
            try
            {
                connection = sqlConnection;
                command.CommandText = cmdText;
                FillDataSet();
                this.Items.Clear();
                this.DisplayMember = dataSet.Tables[0].Columns[displayDataFieldName].Caption;
                this.ValueMember = dataSet.Tables[0].Columns[memberDataFieldName].Caption;
                this.DataSource = dataSet.Tables[0].DefaultView;
            }
            catch (Exception e)
            {
                MessageBox.Show("Произошла ошибка при заполнении списка!" + (Char)13 +
                    e.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void LoadData(SqlConnection sqlConnection, String cmdText,
            int displayDataFieldIndex, int memberDataFieldIndex)
        {
            try
            {
                connection = sqlConnection;
                command.CommandText = cmdText;
                FillDataSet();
                this.Items.Clear();
                this.DisplayMember = dataSet.Tables[0].Columns[displayDataFieldIndex].Caption;
                this.ValueMember = dataSet.Tables[0].Columns[memberDataFieldIndex].Caption;
                this.DataSource = dataSet.Tables[0].DefaultView;
            }
            catch (Exception e)
            {
                MessageBox.Show("Произошла ошибка при заполнении списка!" + (Char)13 +
                    e.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}


Правда тут DevExpress.XtraEditors.CheckedListBoxControl, а не стандартный CheckedListBox, но ты таким же способом можешь сделать свой. 
в FillDataSet() после dataSet.Clear() можно добавиь dataSet.Reset();

Может этот способ не идеален, просто тут на каждый компонент создается DataSet и остальное, но это все можно упростить и оптимизировать!
PM MAIL   Вверх
GMC
Дата 11.4.2007, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 12.12.2006

Репутация: нет
Всего: нет



ну мне как раз и нужно использовать для многих ListBox"сов.
 А твой вариант тока как нить попробую!
smile


Это сообщение отредактировал(а) GMC - 11.4.2007, 10:14
PM MAIL   Вверх
vespa
Дата 18.4.2007, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 20.3.2007

Репутация: нет
Всего: нет



У меня тоже проблема с combobox'ом. Задача в следующем. В программе есть датасет, содержащий одну таблицу (оба созданные с помощью визарда). Приложение должно отображать данные текущей строки. Т.е. есть много textbox'ов, в которых отображаются разные поля текущей записи. И должен быть один combobox, в который загружается содержимое ключевого поля таблицы. И когда выбираешь из выпадающего списка какое-нибудь значение, нужно чтобы отбразились остальные данные. Как это сделать автоматически, т.е. с помощью среды Visual Studio 2005? Какие нужно свойства задать combobox'у?

 
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0979 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.