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


Автор: cypher 30.6.2007, 13:53
Не могу уже два дня решить проблепу! Поиск юзал долго таких тем много но из всего пересмотреного так и не смог решить проблему..  smile 
    так вот я подключаюсь к файлу Access.mdb, после создаю DataSet notaryDS = new DataSet; и загружаю таблицу из Access.mdb в notaryDS через OleDbDataAdapter: 
     OleDbDataAdapter dataAdaper_xls = new OleDbDataAdapter("SELECT * FROM notary", connect_xls);
            dataAdaper_xls.Fill(notaryDS);

После чего создаю DataColumn ... создаю DataTable и додаю в свою DataTable свои DataColumn вот так:
        DataTable notaryTable = new DataTable("Notary");
            notaryTable.Columns.AddRange(new DataColumn[]
                {id_nColumn, name_nColumn, streetName_nColumn, codeStreet_nColumn, 
                 house_nColumn, addressInf_nColumn, phone_nColumn, 
                 organization_nColumn, otherInf_nColumn});

 Наконец додаю DataTable в DataSet
      notaryDS.Tables.Add(notaryTable);
 Потом мне надо все ето отобразить в DataGridView делаю вот так  dataGridViewN.DataSource = notaryTable; в Троельсен пишет что ето и есть отображение таблицы DataTable в DataGridView;(но наверное я что-то не понял)
                  вот мой код на C#
                                              
Код

     public Form1()
        {
            InitializeComponent();
            OleDbConnection connect_xls = new OleDbConnection();
            string strConn = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\'{0}\';Jet OLEDB:Database Password=god;", "NotaryInfo.mdb");
            connect_xls = new OleDbConnection(strConn);
            //creating DataSet
            DataSet notaryDS = new DataSet("notary from NotaryInfo");
            notaryDS.ExtendedProperties["TimeStamp"] = DateTime.Now;
            notaryDS.ExtendedProperties["Company"] = "Information Centre";
            //creating DataAdapter
            connect_xls.Open();
            OleDbDataAdapter dataAdaper_xls = new OleDbDataAdapter("SELECT * FROM notary", connect_xls);
            dataAdaper_xls.Fill(notaryDS);

            DataColumn id_nColumn = new DataColumn("ID", typeof(int));
            id_nColumn.Caption = "ID";
            id_nColumn.ReadOnly = true;
            id_nColumn.AllowDBNull = false;
            id_nColumn.Unique = true;
            id_nColumn.AutoIncrement = true;
            DataColumn name_nColumn = new DataColumn("name", typeof(string));
            DataColumn streetName_nColumn = new DataColumn("street_name", typeof(string));
            DataColumn codeStreet_nColumn = new DataColumn("code_street", typeof(int));
            DataColumn house_nColumn = new DataColumn("house", typeof(string));
            DataColumn addressInf_nColumn = new DataColumn("address_inf", typeof(string));
            DataColumn phone_nColumn = new DataColumn("phone", typeof(string));
            DataColumn organization_nColumn = new DataColumn("organization", typeof(string));
            DataColumn otherInf_nColumn = new DataColumn("other_inf", typeof(string));

            //creating DataTable
            DataTable notaryTable = new DataTable("Notary");
            notaryTable.Columns.AddRange(new DataColumn[]
                {id_nColumn, name_nColumn, streetName_nColumn, codeStreet_nColumn, 
                 house_nColumn, addressInf_nColumn, phone_nColumn, 
                 organization_nColumn, otherInf_nColumn});
            //Set primary key
            notaryTable.PrimaryKey = new DataColumn[] { notaryTable.Columns[0] };
            //Add DataTable in DataSet 
            notaryDS.Tables.Add(notaryTable);

            dataGridViewN.DataSource = notaryTable;
        }

 После всего етого я запузкаю своё приложение и в DataGridView отображаются только названия столбцов([B]смотри файл!) которые я создав в DataTable а отобразить содержимое таблицы никак не могу, как ето сделать?[/B]
     всюду пишут про BindingSource, но я не понимаю что он делает, пробовал я и так делать 
            BindingSource bindSource = new BindingSource();
            bindSource.DataMember = "notary";
            bindSource.DataSource = notaryDS;

  А может ето вообще не то... обясните пожалуйста как мне вручную вывести свою таблицу в DataGridView.
знаю можно сделать автоматически Data Source Configuration Wizard тогда все отображается но он генерирует кода на 1500 строк.

        

Автор: Idsa 30.6.2007, 14:49
Хм... Не очень понятно, зачем ты добавляешь таблицу в DataSet, а потом в качестве DataSource указываешь все ту же таблицу... Хотя проблема, конечно, не в этом.
Ты бы лучше не картинку прикрепил, а проект!

Автор: cypher 30.6.2007, 16:21
не могу! там база даных которую нельзя выставлять...

Автор: tol05 30.6.2007, 16:36
ты в качестве источника данных к DataGridView указываешь не таблицу Dataset (который ты так качественно запонил smile ) а пустую таблицу notaryTable, которую ты создал руками, но данными не заполнил...
вместо 
Код

dataGridViewN.DataSource = notaryTable;

напиши
Код

dataGridViewN.DataSource = notaryDS.Tables[0];

а весь код, начиная со строки 16 до строки 40 - удали вообще...

P.S. вариант 2: 
Код

public Form1()    
        {    
            InitializeComponent();    
            OleDbConnection connect_xls = new OleDbConnection();    
            string strConn = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\'{0}\';Jet OLEDB:Database Password=god;", "NotaryInfo.mdb");    
            connect_xls = new OleDbConnection(strConn);    
            //creating DataSet    
            DataSet notaryDS = new DataSet("notary from NotaryInfo");    
            notaryDS.ExtendedProperties["TimeStamp"] = DateTime.Now;    
            notaryDS.ExtendedProperties["Company"] = "Information Centre";    
           
            DataColumn id_nColumn = new DataColumn("ID", typeof(int));    
            id_nColumn.Caption = "ID";    
            id_nColumn.ReadOnly = true;    
            id_nColumn.AllowDBNull = false;    
            id_nColumn.Unique = true;    
            id_nColumn.AutoIncrement = true;    
            DataColumn name_nColumn = new DataColumn("name", typeof(string));    
            DataColumn streetName_nColumn = new DataColumn("street_name", typeof(string));    
            DataColumn codeStreet_nColumn = new DataColumn("code_street", typeof(int));    
            DataColumn house_nColumn = new DataColumn("house", typeof(string));    
            DataColumn addressInf_nColumn = new DataColumn("address_inf", typeof(string));    
            DataColumn phone_nColumn = new DataColumn("phone", typeof(string));    
            DataColumn organization_nColumn = new DataColumn("organization", typeof(string));    
            DataColumn otherInf_nColumn = new DataColumn("other_inf", typeof(string));    
            //creating DataTable    
            DataTable notaryTable = new DataTable("Notary");    
            notaryTable.Columns.AddRange(new DataColumn[]    
                {id_nColumn, name_nColumn, streetName_nColumn, codeStreet_nColumn,    
                 house_nColumn, addressInf_nColumn, phone_nColumn,    
                 organization_nColumn, otherInf_nColumn});    
            //Set primary key    
            notaryTable.PrimaryKey = new DataColumn[] { notaryTable.Columns[0] };    
            //Add DataTable in DataSet    
            notaryDS.Tables.Add(notaryTable);
           //creating DataAdapter    
            connect_xls.Open();    
            OleDbDataAdapter dataAdaper_xls = new OleDbDataAdapter("SELECT * FROM notary", connect_xls);    
            dataAdaper_xls.Fill(notaryDS);    //здесь твою таблицу адаптер заполнит данными    
            dataGridViewN.DataSource = notaryTable;    //таблица уже заполнена
        }

Автор: cypher 30.6.2007, 18:04
tol05 smile  Очень большое спасибо!!!! 
зделал так как ты сказал и все заработало! респект.
теперь надо сделать чтобы я ввёл изменение и при нажатии кнопки ети изменения из DataGridView переносились в БД! пока что не представляю себе как ето сделать... если есть предложения буду очень признателен!

Автор: tol05 30.6.2007, 19:57
1. Адаптер нужно сделать переменной класса. И все остальные объекты (датасет, таблицы) тоже... Чтоб доступ к ним был из любого метода...
2. Нужно написать http://msdn2.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter.updatecommand.aspx
Код

 private void button1_Click(object sender, EventArgs e)
    {
      dataAdaper_xls.UpdateCommand = new SqlCommand("UPDATE table1 SET ...", connect_xls);//текст команды измени
      dataAdaper_xls.Update(notaryDS);
    }


И вообще, почитать MSDN по DataAdapter, DataSet. Или просто книжку по ADO.NET

Автор: cypher 30.6.2007, 20:40
Код

       private void button1_Click(object sender, EventArgs e)
    {
      dataAdaper_xls.UpdateCommand = new SqlCommand("UPDATE table1 SET ...", connect_xls);//текст команды измени
      dataAdaper_xls.Update(notaryDS);
    }



я вот только не понимаю что надо обновлять, тоесть как отслеживать что именно было изменино в DataGridView, или может можно всё сразу обновить??, внести в БД нажатием етой кнопки все изменения из DataGridView. Тоесь что нужно подставлять в SET.. "UPDATE мояТаблица SET аТутЧто?", как узнать что я изменил в DataGridView? 

P.S. понимаю что вопросы наивные но у меня времени очень мало, надо всё доделать до Понедельника!! smile 

Автор: cypher 30.6.2007, 21:06
Ура решил проблему!! 
    
Код


              private void button1_Click(object sender, EventArgs e)
        {
           
            OleDbCommandBuilder commBuilder = new OleDbCommandBuilder(dataAdaper_xls);
            dataAdaper_xls.UpdateCommand = commBuilder.GetUpdateCommand();
            dataAdaper_xls.Update(notaryDS.Tables[0]);

          
        }


не совсем понимаю как работает но.. при нажатии кнопки вносит изменения в БД сделаные в DataGridView.

Автор: thomas 1.7.2007, 12:33
cypher, 
Не забудь дописать
Код

notaryDS.Tables[0].AcceptChanges()


 smile 

Автор: cypher 1.7.2007, 16:12
Цитата(thomas @ 1.7.2007,  12:33)
cypher, 
Не забудь дописать
Код

notaryDS.Tables[0].AcceptChanges()


 smile

а зачем если оно и так работает, что ета строчка будет делать? smile 

Автор: thomas 1.7.2007, 17:50
cypher, 

http://msdn.microsoft.com/library/rus/default.asp?url=/library/RUS/cpref/html/frlrfsystemdatadatasetclassacceptchangestopic.asp что надо читать первоисточники. 
Там слева оглавление есть, посмотри пригодиться.  smile 

Автор: Idsa 2.7.2007, 07:43
Цитата(thomas @  1.7.2007,  17:50 Найти цитируемый пост)
Затем что надо читать первоисточники. Там слева оглавление есть, посмотри пригодиться.  

Хм... Насколько я знаю, в случае успешного апдейта адаптер сам меняет значения RowState на UnChanged... так что неудивительно, что у cypher все и так работает.

Автор: thomas 2.7.2007, 10:12
Idsa, 
Цитата

так что неудивительно, что у cypher все и так работает. 

Да база у него обновляется, но представь себе ситуацию:
- внесли изменения в DataGridView 
- обновили базу
- очистили DataGridView (не нужно больше отображать эти данные)
- сделали какие-то другие действия
И внимание !!!
Нужно СНОВА вывести данные из этой таблицы ДатаСет в DataGridView 

Что в данном случае будет отображаться? 

Автор: tol05 2.7.2007, 10:43
thomas, а я в первоисточниках другое читал как-то...  
Цитата

При использовании метода Update, порядок выполнения следующий: 

Значения в DataRow перемещаются в значения параметров. 
Вызывается событие OnRowUpdating. 
Команда выполняется. 
Если команда установлена на FirstReturnedRecord, то первый возвращаемый результат помещается в DataRow. 
Если есть выходные параметры, то они помещаются в DataRow. 
Вызывается событие OnRowUpdated. 
Вызывается AcceptChanges. 

http://msdn.microsoft.com/library/rus/default.asp?url=/library/rus/cpref/html/frlrfsystemdatacommondataadapterclassupdatetopic.asp

и писал когда-то http://forum.vingrad.ru/index.php?showtopic=150459&view=findpost&p=1129662
 smile 

Автор: Idsa 2.7.2007, 13:22
thomas, 
Цитата(thomas @  2.7.2007,  10:12 Найти цитируемый пост)
Что в данном случае будет отображаться? 

Похоже, ты не обратил внимание на мой пост:
Цитата(Idsa @  2.7.2007,  07:43 Найти цитируемый пост)
в случае успешного апдейта адаптер сам меняет значения RowState на UnChanged... так что неудивительно, что у cypher все и так работает.


Автор: cypher 2.7.2007, 17:17
я очень стараюсь понять что вы сдесь обсуждаете smile 
 но у меня есть еще одна существенная задача.. 
нужно както организовать поиск по DataGridViewN дёргал поиск но там нашёл
только  поиск с помощью DataTable.Select() который я так и не понял как работает.
Можно как то искать по содержимому DataGridViewN или DataGridViewN.DataSource и потом их както выделять в DataGridViewN (например ввёл фразу оно нашло и както выделило, ну как в Excel, например)
я не очень представляю как хранятся данные в DataGridView.. ёще про фильтры что-то пишут
но как оно все роботает smile 

 P.S. почему когда я выделяю в своём DataGridViewNБ мотом жму Ctrl-C открываю Excel жму Ctrl-V нормально отображаюся только цифры, а буквы(русские) ероглифы и кружечки smile 

Автор: Idsa 2.7.2007, 17:29
cypher, раз изначальный вопрос решен, тебе следует сообщить, что тема закрыта (а еще лучше и соответствующую галочку вверху справа поставить). Для последующих же вопросов стоит открывать новые топики.

Автор: cypher 2.7.2007, 18:38
Да что-то я увлёкся, спасибо з замечание, и всем кто помог решить изначальный вопрос smile  smile 

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