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


Автор: okaton 13.10.2008, 22:05
Доброго времени сутокsmile
Помогите решить проблему. Есть DataGridView1 и DataGridView2, также есть 2 класса.
Нужно связать DataGridView1 и DataGridView2 с двумя классами таким образом, что бы когда выбираешь строку в DataGridView1 в DataGridView2 отображались дополнительные данные.
После этого организовать связь с dataSet, ну и в нем соответственно сохранять и загружать данные.
Код

public class CLASS_dataGridView2
        {
            string[] brand = null;
            public string[] SubClass_Brand
            {
                get
                {
                    return brand;
                }
            }

            string[] recruitment = null;
            public string[] SubClass_Recruitment
            {
                get
                {
                    return recruitment;
                }
            }

            string[] registrationID = null;
            public string[] SubClass_RegistrationID
            {
                get
                {
                    return registrationID;
                }
            }
            string[] subComment = null;
            public string[] SubClass_SubComment
            {
                get
                {
                    return subComment;
                }
            }

            string[] notes = null;
            public string[] SubClass_Notes
            {
                get
                {
                    return notes;
                }
            }
        }

        public class CLASS_dataGridView1
        {
            string factoryID = null;
            public string SubClass_FactoryID
            {
                get
                {
                    return factoryID;
                }
            }

            string idComplete = null;
            public string SubClass_IDComplete
            {
                get
                {
                    return idComplete;
                }
            }

            string departament = null;
            public string SubClass_Departament
            {
                get
                {
                    return departament;
                }
            }

            string responsible = null;
            public string SubClass_Responsible
            {
                get
                {
                    return responsible;
                }
            }

            string building = null;
            public string SubClass_Building
            {
                get
                {
                    return building;
                }
            }

            string room = null;
            public string SubClass_Room
            {
                get
                {
                    return room;
                }
            }

            string comment = null;
            public string SubClass_Comment
            {
                get
                {
                    return comment;
                }
            }

            public CLASS_dataGridView2 class_dataGridView2;
        }

Автор: Partizan 13.10.2008, 23:44
кросспостинг - это не хорошо...

Автор: okaton 13.10.2008, 23:56
Partizan, может это и не хорошо, но мне нужна реально действенная помощь, причем довольно срочно, а обратится мне больше не куда. И что же мне делать? бублики пинать?

Автор: MasterOfCode 14.10.2008, 11:38
Цитата(okaton @  14.10.2008,  01:05 Найти цитируемый пост)
Нужно связать DataGridView1 и DataGridView2 с двумя классами таким образом, что бы когда выбираешь строку в DataGridView1 в DataGridView2 отображались дополнительные данные.

Это можно сделать так:
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        class MyClass
        {
            public MyClass(int _id, string _name)
            {
                id = _id;
                name = _name;
            }
            public int id
            {
                get;
                set;
            }
            public string name
            {
                get;
                set;
            }
        }

        class MyParentClass
        {
            public MyParentClass(int _id, int _parentid, string _name)
            {
                id = _id;
                parentId = _parentid;
                parentName = _name;
            }
            public int id
            {
                get;
                set;
            }
            public int parentId
            {
                get;
                set;
            }
            public string parentName
            {
                get;
                set;
            }
        }
        List<MyClass> dgv1;
        List<MyParentClass> dgv2;
        List<MyParentClass> dgv2_;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            dgv1 = new List<MyClass>();
            dgv2 = new List<MyParentClass>();
            for (int i = 0; i < 3; i++)
            {
                dgv1.Add(new MyClass(i, i.ToString()));
                for(int j = -1; j < i; j++)
                {
                    dgv2.Add(new MyParentClass(j, i, j.ToString()));
                }
            }
            dataGridView1.DataSource = dgv1;
            IEnumerable<MyParentClass> query = dgv2.Where(pcls => pcls.parentId == Convert.ToInt32(dataGridView1[0, 0].Value));
            dgv2_ = query.ToList<MyParentClass>();
            dataGridView2.DataSource = dgv2_;
            dataGridView2.Refresh();
        }

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            IEnumerable<MyParentClass> query = dgv2.Where(pcls => pcls.parentId == Convert.ToInt32(dataGridView1[e.ColumnIndex, e.RowIndex].Value));
            dgv2_ = query.ToList<MyParentClass>();
            dataGridView2.DataSource = dgv2_;
            dataGridView2.Refresh();
        }
    }
}


Добавлено через 31 секунду
Подставь свои классы только smile

Автор: okaton 14.10.2008, 14:20
MasterOfCode, спасибо большое.

using System.Linq у меня такого нет, это из framework 3?
По ходу 3.5 сейчас установлюsmile

Автор: MasterOfCode 14.10.2008, 14:25
Цитата(okaton @  14.10.2008,  17:20 Найти цитируемый пост)
using System.Linq у меня такого нет, это из framework 3? 

3.5

Автор: okaton 14.10.2008, 15:20
Скажите а MVS 2005 работает с Framework 3.5?

Автор: okaton 14.10.2008, 15:38
решил скачать MVS 2008  smile 

Автор: Magnifico 14.10.2008, 20:13
MasterOfCode взаимно.
okaton ключевые слова: Nowa + MVS 2008 

Автор: okaton 14.10.2008, 20:35
Цитата(Magnifico @ 14.10.2008,  21:13)
okaton ключевые слова: Nowa + MVS 2008

Стесняюсь спросить, а что такое Nowa?

Автор: Partizan 15.10.2008, 09:05
присоединяюсь к вопросу) Что ещё за Nowa?  smile 

Автор: okaton 15.10.2008, 10:50
Установил 9 студию smile
Возникли траблы в отладчике

Код

IEnumerable<MyParentClass> query = dgv2.Where(pcls => pcls.parentId == Convert.ToInt32(dataGridView1[0, 0].Value));

Цитата

Error    1    'System.Collections.Generic.List<Set1DataWork.Form1.MyParentClass>' does not contain a definition for 'Where' and no extension method 'Where' accepting a first argument of type 'System.Collections.Generic.List<Set1DataWork.Form1.MyParentClass>' could be found (are you missing a using directive or an assembly reference?)    ...\Form1.cs    82    53    Set1DataWork


Код

dgv2_ = query.ToList<MyParentClass>();

Цитата

Error    2    'System.Collections.Generic.IEnumerable<Set1DataWork.Form1.MyParentClass>' does not contain a definition for 'ToList' and no extension method 'ToList' accepting a first argument of type 'System.Collections.Generic.IEnumerable<Set1DataWork.Form1.MyParentClass>' could be found (are you missing a using directive or an assembly reference?)    ...\Form1.cs    83    27    Set1DataWork


Код

IEnumerable<MyParentClass> query = dgv2.Where(pcls => pcls.parentId == Convert.ToInt32(dataGridView1[e.ColumnIndex, e.RowIndex].Value));

Цитата

Error    3    'System.Collections.Generic.List<Set1DataWork.Form1.MyParentClass>' does not contain a definition for 'Where' and no extension method 'Where' accepting a first argument of type 'System.Collections.Generic.List<Set1DataWork.Form1.MyParentClass>' could be found (are you missing a using directive or an assembly reference?)    ...\Form1.cs    89    53    Set1DataWork


Код

dgv2_ = query.ToList<MyParentClass>();

Цитата

Error    4    'System.Collections.Generic.IEnumerable<Set1DataWork.Form1.MyParentClass>' does not contain a definition for 'ToList' and no extension method 'ToList' accepting a first argument of type 'System.Collections.Generic.IEnumerable<Set1DataWork.Form1.MyParentClass>' could be found (are you missing a using directive or an assembly reference?)    ...\Form1.cs    90    27    Set1DataWork


Ругается на .Where и .ToList<MyParentClass>
 smile Что он от меня хочет?

Автор: Idsa 15.10.2008, 11:21
Цитата(okaton @  15.10.2008,  14:50 Найти цитируемый пост)
Ругается на .Where и .ToList<MyParentClass>
 smile Что он от меня хочет?

Необходимо подключить using System.Linq;

Автор: okaton 15.10.2008, 12:12
Idsa, упс, это я действительно прогляделsmile

только почему-то он у меня не подключается:
Цитата

Error    1    The type or namespace name 'Linq' does not exist in the namespace 'System' (are you missing an assembly reference?)

Автор: MasterOfCode 15.10.2008, 12:17
Добавь библиотеку в reference

Автор: Idsa 15.10.2008, 12:26
Цитата(okaton @  15.10.2008,  16:12 Найти цитируемый пост)
олько почему-то он у меня не подключается:

Хм... Для этого нужна библиотека System.Core. Если у Вас действительно стоит VS 2008 и Target Framework выставлен в 3.5, то она должна добавляться автоматически.

Автор: okaton 15.10.2008, 13:10
MasterOfCode, Idsa, спасибоsmile
я проект конвертировал с 2005 на 2008... ну и о нововведения не знал...
зашел в свойства проекта и обнаружил подключение framework, соответственно был 2.0, поменял на 3.5 и ура!

Подскажите пожалуйста, а как мне теперь заполнить dataSet?

Автор: MasterOfCode 15.10.2008, 13:34
Тебе сначала нужно заполнить DataTable.
Вот ссылка на MSDN http://msdn.microsoft.com/en-us/library/system.data.datatable.aspx
dataSet1.Tables.Add(YouDataTable);


Автор: okaton 15.10.2008, 13:40
MasterOfCode, спасибо, буду разбиратьсяsmile

Попутно появились вопросы:

1. А как мне к этой красоте подключить столбцы, которые я нарисовал в дизайнере dataGridView?
С этим разобрался, надо в свойстве Колонки DataGridView изменить DataPropertyName подставив член класса 


2. Сортировка колонок не происходит, отладчик ругается  
Код

IEnumerable<MyParentClass> query = dgv2.Where(pcls => pcls.parentId == Convert.ToInt32(dataGridView1[e.ColumnIndex, e.RowIndex].Value));

Цитата

Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Имя параметра: index

Как можно выйти из этого положения?

3. Кто-нибудь пользовался методом System.Data.DataTableExtensions.ToDataTable<T>(IEnumerable<T> source), эту табличку потом можно подключить к dataSet?

Автор: okaton 16.10.2008, 18:41
У меня не получается создать новую строку (а тем более правило для создания строк) в таблицах. :(
Как сделать так чтобы можно было создать новую строку в 2 таблицах и соответственно данные в ней привязать к коллекции. 
Все создание строк работает только на этом этапе smile 
Код

dgv1.Add(new CLASS_dgv1(0, "", "", "", "", "", "", ""));
dgv1.Add(new CLASS_dgv1(1, "", "", "", "", "", "", ""));            
                        
dgv2.Add(new CLASS_dgv2(0, "", "", "", "", ""));
dgv2.Add(new CLASS_dgv2(0, "", "", "", "", ""));
dgv2.Add(new CLASS_dgv2(1, "", "", "", "", ""));
dgv2.Add(new CLASS_dgv2(1, "", "", "", "", ""));

Ну и еще проблема не работает сортировка в dataGridView...

Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq; 
using System.Text;
using System.Windows.Forms;

namespace Set1DataWork
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        
        class CLASS_dgv1//класс для 1 таблицы
        {
            public CLASS_dgv1(int _IndexTable1, string _FactoryID, string _IDComplete, string _Departament, string _Responsible, string _Building, string _Room, string _Comment)
            {
                Column0_IndexTable1 = _IndexTable1;
                Column01_FactoryID = _FactoryID;                        
                Column02_IDComplete = _IDComplete;
                Column03_Departament = _Departament;
                Column04_Responsible = _Responsible;
                Column05_Building = _Building;
                Column06_Room = _Room;
                Column07_Comment = _Comment;
                               
            }
            public int Column0_IndexTable1
            {
                get;
                set;
            }
            public string Column01_FactoryID
            {
                get;
                set;
            }
            public string Column02_IDComplete
            {
                get;
                set;
            }
            public string Column03_Departament
            {
                get;
                set;
            }
            public string Column04_Responsible
            {
                get;
                set;
            }
            public string Column05_Building
            {
                get;
                set;
            }
            public string Column06_Room
            {
                get;
                set;
            }
            public string Column07_Comment
            {
                get;
                set;
            }
            
        }

        class CLASS_dgv2 //класс для 2 таблицы
        {
            public CLASS_dgv2(int _IndexTable2, string _Brand, string _Recruitment, string _RegistrationID, string _SubComment, string _Notes)
            {
                Column00_IndexTable2 = _IndexTable2;
                Column08_Brand = _Brand;
                Column09_Recruitment = _Recruitment;
                Column10_RegistrationID = _RegistrationID;
                Column11_SubComment = _SubComment;
                Column12_Notes = _Notes;
            }
            public int Column00_IndexTable2
            {
                get;
                set;
            }
            public string Column08_Brand
            {
                get;
                set;
            }
            public string Column09_Recruitment
            {
                get;
                set;
            }
            public string Column10_RegistrationID
            {
                get;
                set;
            }
            public string Column11_SubComment
            {
                get;
                set;
            }
            public string Column12_Notes
            {
                get;
                set;
            }
        }
        
        List<CLASS_dgv1> dgv1;   
        List<CLASS_dgv2> dgv2;      
        List<CLASS_dgv2> dgv2_;
         
         
                   
        private void toolStripButton1_Click(object sender, EventArgs e)
        {            
            dgv1 = new List<CLASS_dgv1>();
            dgv2 = new List<CLASS_dgv2>();       
                      

            dgv1.Add(new CLASS_dgv1(0, "", "", "", "", "", "", ""));
            dgv1.Add(new CLASS_dgv1(1, "", "", "", "", "", "", ""));            
                        
            dgv2.Add(new CLASS_dgv2(0, "", "", "", "", ""));
            dgv2.Add(new CLASS_dgv2(0, "", "", "", "", ""));
            dgv2.Add(new CLASS_dgv2(1, "", "", "", "", ""));
            dgv2.Add(new CLASS_dgv2(1, "", "", "", "", ""));
            
                       
            dataGridView1.DataSource = dgv1;              
            IEnumerable<CLASS_dgv2> query = dgv2.Where(pcls => pcls.Column00_IndexTable2 == Convert.ToInt32(dataGridView1[0, 0].Value));
            dgv2_ = query.ToList<CLASS_dgv2>(); 
            dataGridView2.DataSource = dgv2_; 
            dataGridView2.Refresh();                   
        }
               
        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            IEnumerable<CLASS_dgv2> query = dgv2.Where(pcls => pcls.Column00_IndexTable2 == Convert.ToInt32(dataGridView1[e.ColumnIndex, e.RowIndex].Value));
            dgv2_ = query.ToList<CLASS_dgv2>();
            dataGridView2.DataSource = dgv2_;
            dataGridView2.Refresh(); 
        }
    }
}

Автор: MasterOfCode 16.10.2008, 20:07
Код

IEnumerable<CLASS_dgv2> query = dgv2.Where(pcls => pcls.Column00_IndexTable2 == Convert.ToInt32(dataGridView1[0, e.RowIndex].Value));

я ошибся в этой строчке, e.ColumnIndex нужно заменить на номер колонки с идишником, в данном случаи на 0.

Цитата(okaton @  16.10.2008,  21:41 Найти цитируемый пост)
У меня не получается создать новую строку 

А у грида разрешение на добавление стоит?

Цитата(okaton @  16.10.2008,  21:41 Найти цитируемый пост)
Ну и еще проблема не работает сортировка в dataGridView...


А у грида разрешение на сортировку стоит?

Автор: okaton 16.10.2008, 20:23
Цитата
А у грида разрешение на добавление стоит?
А у грида разрешение на сортировку стоит? 

Стоит. Строки можно добавлять и сортировать. Пока я не нажимаю:
Код

private void toolStripButton1_Click(object sender, EventArgs e)


Автор: MasterOfCode 16.10.2008, 20:43
Если после повторного нажатия, то возможно из за этого:
Код

dgv1 = new List<CLASS_dgv1>();
dgv2 = new List<CLASS_dgv2>();

Замени на:
Код

if (dgv1 == null)
dgv1 = new List<CLASS_dgv1>();
if (dgv2 == null)
dgv2 = new List<CLASS_dgv2>();

Автор: okaton 16.10.2008, 21:34
После первого нажатия. 

Ругается на сортировку:
Цитата

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            IEnumerable<CLASS_dgv2> query = dgv2.Where(pcls => pcls.Column00_IndexTable2 == Convert.ToInt32(dataGridView1[0, e.RowIndex].Value));

Цитата

Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Имя параметра: index

e.RowIndex =-1

Строки не добавляются. После изменения при повторном нажатии добавляются 2  строки в dataGridView2 с сохранением данных, но к каждой строке в таблице dataGridView1

Автор: MasterOfCode 17.10.2008, 07:09
В событие CellClick добавь условие:
Код

            if (e.RowIndex >= 0)
            {
                IEnumerable<CLASS_dgv2> query = dgv2.Where(pcls => pcls.Column00_IndexTable2 == Convert.ToInt32(dataGridView1[0, e.RowIndex].Value));
                dgv2_ = query.ToList<CLASS_dgv2>();
                dataGridView2.DataSource = dgv2_;
                dataGridView2.Refresh();
            }

Автор: okaton 17.10.2008, 10:12
Добавил. Ошибка соответственно исчезла. 
В остальном тоже самое: сортировка не происходит, строки не добавляются  smile  
Цитата

Если пользователь прокрутит control вниз до последней строчки, будет отображена дополнительная, специальная строчка для внесения новой записи. Такая строчка всегда помечена символом звездочки на заголовке. Когда пользователь любым способом перемещается в эту строку, DataGridView добавляет новую запись со значениями по умолчанию. Если фокус ввода находится в этой строке, и пользователь нажимает Esc, новая запись пропадает, а фокус ввода перемещается на строчку выше.

Звездочка после нажатия toolStripButton1_Click также исчезает.

Автор: okaton 17.10.2008, 22:00
Я не очень понимаю концепцию dataTable. Мне при этом нужна будет коллекция которая у меня сейчас есть или dataTable сама является коллекцией (если это можно так назвать)

Автор: okaton 18.10.2008, 15:06
Чем можно заменить эту строчку для dataDridView?
Код

dataGrid1.SetDataBinding(dataSet, "ParentTable");


вот так
Код

dataGridView1.DataSource = dataSet.Tables["ParentTable"];

Автор: okaton 18.10.2008, 21:37
В общем я переработал код еще раз:
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq; 
using System.Text;
using System.Windows.Forms;

namespace Set1DataWork
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent(); 
            MakeDataTables();
        }
        
        class CLASS_dgv1//класс для 1 таблицы
        {
            public CLASS_dgv1(int _IndexTable1, string _FactoryID, string _IDComplete, string _Departament, string _Responsible, string _Building, string _Room, string _Comment)
            {
                Column0_IndexTable1 = _IndexTable1;
                Column01_FactoryID = _FactoryID;                        
                Column02_IDComplete = _IDComplete;
                Column03_Departament = _Departament;
                Column04_Responsible = _Responsible;
                Column05_Building = _Building;
                Column06_Room = _Room;
                Column07_Comment = _Comment;
                               
            }
            public int Column0_IndexTable1
            {
                get;
                set;
            }
            public string Column01_FactoryID
            {
                get;
                set;
            }
            public string Column02_IDComplete
            {
                get;
                set;
            }
            public string Column03_Departament
            {
                get;
                set;
            }
            public string Column04_Responsible
            {
                get;
                set;
            }
            public string Column05_Building
            {
                get;
                set;
            }
            public string Column06_Room
            {
                get;
                set;
            }
            public string Column07_Comment
            {
                get;
                set;
            }
            
        }

        class CLASS_dgv2 //класс для 2 таблицы
        {
            public CLASS_dgv2(int _IndexTable2, string _Brand, string _Recruitment, string _RegistrationID, string _SubComment, string _Notes)
            {
                Column00_IndexTable2 = _IndexTable2;
                Column08_Brand = _Brand;
                Column09_Recruitment = _Recruitment;
                Column10_RegistrationID = _RegistrationID;
                Column11_SubComment = _SubComment;
                Column12_Notes = _Notes;
            }
            public int Column00_IndexTable2
            {
                get;
                set;
            }
            public string Column08_Brand
            {
                get;
                set;
            }
            public string Column09_Recruitment
            {
                get;
                set;
            }
            public string Column10_RegistrationID
            {
                get;
                set;
            }
            public string Column11_SubComment
            {
                get;
                set;
            }
            public string Column12_Notes
            {
                get;
                set;
            }
        }
                     
        private System.Data.DataSet dataSet;        
        public System.Data.DataTable table1 = new DataTable("ParentTable");  
        public DataTable table2 = new DataTable("childTable");
        public int indexTable; 


        private void MakeDataTables()
        {
            MakeParentTable();    
            MakeChildTable();     
            MakeDataRelation();  
            BindToDataGridView();
        }

        private void MakeParentTable()
        {  
            DataColumn column;
            DataRow row;
                        
            column = new DataColumn();
            column.DataType = System.Type.GetType("System.Int32");
            column.ColumnName = "Column0_IndexTable1";
            column.AutoIncrement = true; //работает как-то не правильно
            column.Caption = "IT1";
            column.ReadOnly = true;
            column.Unique = true;
            table1.Columns.Add(column);
            
            column = new DataColumn();
            column.DataType = System.Type.GetType("System.String");
            column.ColumnName = "Column01_FactoryID";
            column.AutoIncrement = false;
            column.Caption = "Заводской номер";
            column.ReadOnly = false;
            column.Unique = false;
            table1.Columns.Add(column);
            
            column = new DataColumn();
            column.DataType = System.Type.GetType("System.String");
            column.ColumnName = "Column02_IDComplete";
            column.AutoIncrement = false;
            column.Caption = "ID Комплекта";
            column.ReadOnly = false;
            column.Unique = false;
            table1.Columns.Add(column);

            column = new DataColumn();
            column.DataType = System.Type.GetType("System.String");
            column.ColumnName = "Column03_Departament";
            column.AutoIncrement = false;
            column.Caption = "Отдел";
            column.ReadOnly = false;
            column.Unique = false;
            table1.Columns.Add(column);
            
            column = new DataColumn();
            column.DataType = System.Type.GetType("System.String");
            column.ColumnName = "Column04_Responsible";
            column.AutoIncrement = false;
            column.Caption = "Ответственный";
            column.ReadOnly = false;
            column.Unique = false;
            table1.Columns.Add(column);

            column = new DataColumn();
            column.DataType = System.Type.GetType("System.String");
            column.ColumnName = "Column05_Building";
            column.AutoIncrement = false;
            column.Caption = "Корпус";
            column.ReadOnly = false;
            column.Unique = false;
            table1.Columns.Add(column);

            column = new DataColumn();
            column.DataType = System.Type.GetType("System.String");
            column.ColumnName = "Column06_Room";
            column.AutoIncrement = false;
            column.Caption = "Комната";
            column.ReadOnly = false;
            column.Unique = false;
            table1.Columns.Add(column);
            
            column = new DataColumn();
            column.DataType = System.Type.GetType("System.String");
            column.ColumnName = "Column07_Comment";
            column.AutoIncrement = false;
            column.Caption = "Примечание";
            column.ReadOnly = false;
            column.Unique = false;
            table1.Columns.Add(column);
            
            //DataColumn[] PrimaryKeyColumns = new DataColumn[1];
            //PrimaryKeyColumns[0] = table1.Columns["Column0_IndexTable1"];
            //table1.PrimaryKey = PrimaryKeyColumns;
            
            dataSet = new DataSet();
            dataSet.Tables.Add(table1);
                           
            row = table1.NewRow();
            indexTable = 0;
            row["Column0_IndexTable1"] = indexTable;                
            table1.Rows.Add(row);        
        }

        private void MakeChildTable()
        {  
            DataColumn column;
            DataRow row;

            column = new DataColumn();
            column.DataType = System.Type.GetType("System.Int32");
            column.ColumnName = "Column00_IndexTable2";
            column.AutoIncrement = false;
            column.Caption = "IT2";
            column.ReadOnly = true;
            column.Unique = false;
            table2.Columns.Add(column);
            
            column = new DataColumn();
            column.DataType = System.Type.GetType("System.String");
            column.ColumnName = "Column08_Brand";
            column.AutoIncrement = false;
            column.Caption = "Наименование изделия";
            column.ReadOnly = false;
            column.Unique = false;
            table2.Columns.Add(column);            

            column = new DataColumn();
            column.DataType = System.Type.GetType("System.String");
            column.ColumnName = "Column09_Recruitment";
            column.AutoIncrement = false;
            column.Caption = "Комплектация";
            column.ReadOnly = false;
            column.Unique = false;
            table2.Columns.Add(column);
                        
            column = new DataColumn();
            column.DataType = System.Type.GetType("System.String");
            column.ColumnName = "Column10_RegistrationID";
            column.AutoIncrement = false;
            column.Caption = "Учетный номер";
            column.ReadOnly = false;
            column.Unique = false;
            table2.Columns.Add(column);
                        
            column = new DataColumn();
            column.DataType = System.Type.GetType("System.String");
            column.ColumnName = "Column11_SubComment";
            column.AutoIncrement = false;
            column.Caption = "Примечание";
            column.ReadOnly = false;
            column.Unique = false;
            table2.Columns.Add(column);

            column = new DataColumn();
            column.DataType = System.Type.GetType("System.String");
            column.ColumnName = "Column12_Notes";
            column.AutoIncrement = false;
            column.Caption = "Заметки";
            column.ReadOnly = false;
            column.Unique = false;
            table2.Columns.Add(column);

            dataSet.Tables.Add(table2);
             
            row = table2.NewRow();
            indexTable = 0;
            row["Column00_IndexTable2"] = indexTable;
            table2.Rows.Add(row);
        }

        private void MakeDataRelation()
        {
            DataColumn parentColumn = dataSet.Tables["ParentTable"].Columns["Column0_IndexTable1"];
            DataColumn childColumn = dataSet.Tables["ChildTable"].Columns["Column00_IndexTable2"];
            DataRelation relation = new DataRelation("parent2Child", parentColumn, childColumn);
            dataSet.Tables["ChildTable"].ParentRelations.Add(relation);
        }

        private void BindToDataGridView()
        {
            dataGridView1.DataSource = dataSet.Tables["ParentTable"];
            dataGridView2.DataSource = dataSet.Tables["ChildTable"];            
        }
                   

        private void toolStripButton1_Click(object sender, EventArgs e)
        {
           dataSet.ReadXml("123.xml");
        }              

        private void toolStripButton2_Click(object sender, EventArgs e)
        {            
            dataSet.WriteXml("123.xml");
        }        

        private void toolStripButton4_Click(object sender, EventArgs e)
        {               
            CurrencyManager cmgr = (CurrencyManager)this.dataGridView1.BindingContext[this.dataGridView1.DataSource];
            DataRow row = ((DataRowView)cmgr.Current).Row;
            string column0_IndexTable1 = row["Column0_IndexTable1"].ToString();
            
            row = table2.NewRow();
            row["Column00_IndexTable2"] = column0_IndexTable1;
            table2.Rows.Add(row);
        }
    }
}

Автор: okaton 20.10.2008, 12:15
Теперь как-то нужно опять связать 1 и 2 таблицу и при создании строк предусмотреть обновление Column0_IndexTable1 и Column00_IndexTable2  smile 
Автоинкремент работает как-то не правильно, почему он увеличивается если строка не создалась?

P.S.  А что такое вот это (я понимаю что это первичный ключ таблицы, как его использовать?)
Код

DataColumn[] PrimaryKeyColumns = new DataColumn[1];
PrimaryKeyColumns[0] = table1.Columns["Column0_IndexTable1"];
table1.PrimaryKey = PrimaryKeyColumns;

и вот это (тут я понимаю организовываются связи, а как организовать подходящую для меня?)
Код

DataColumn parentColumn = dataSet.Tables["ParentTable"].Columns["Column0_IndexTable1"];
DataColumn childColumn = dataSet.Tables["ChildTable"].Columns["Column00_IndexTable2"];
DataRelation relation = new DataRelation("parent2Child", parentColumn, childColumn);
dataSet.Tables["ChildTable"].ParentRelations.Add(relation);


P.P.S.
Можно каким-либо образом воздействовать на dataGridView2_UserAddedRow чтобы при добавлении новой строки в dataGridView2 учитывался этот код, если вставить на прямую соответственно добавятся много не нужных строк
Код
             
            CurrencyManager cmgr = (CurrencyManager)this.dataGridView1.BindingContext[this.dataGridView1.DataSource];
            DataRow row = ((DataRowView)cmgr.Current).Row;
            string column0_IndexTable1 = row["Column0_IndexTable1"].ToString();
            
            row = table2.NewRow();
            row["Column00_IndexTable2"] = column0_IndexTable1;
            table2.Rows.Add(row);       

Автор: okaton 20.10.2008, 14:50
Судя по всему, эта связь организована правильно, но она почему-то не работает smile 

Код

DataColumn parentColumn = dataSet.Tables["ParentTable"].Columns["Column0_IndexTable1"];
DataColumn childColumn = dataSet.Tables["ChildTable"].Columns["Column00_IndexTable2"];
DataRelation relation = new DataRelation("parent2Child", parentColumn, childColumn);
dataSet.Tables["ChildTable"].ParentRelations.Add(relation);



Автор: okaton 20.10.2008, 17:48
Походу дело не в DataRelation, а в чем-то другом...

Автор: okaton 20.10.2008, 18:35
А почему отладчик ругается?
Код

dataGridView2.DataMember = "Column0_IndexTable1";

Цитата

Список потомков для поля Column0_IndexTable1 создать нельзя.

Автор: okaton 20.10.2008, 23:32
 smile 
Ларчик просто открывался
Код

dataGridView2.DataSource = dataSet;
dataGridView2.DataMember = "ParentTable.parent2Child";


Автоинкремент работает как-то не правильно, почему-то он увеличивается если строка не создалась.
Логика-то его мне ясно, но можно ли этого избежать?

Автор: okaton 22.10.2008, 10:58
Нужно получить все значения колонки Column0_IndexTable1 и создать условие. Если все числа в колонке идут по порядку, то добавить строку = последнее число + 1.  Если нет, то добавить строку с числом которого не хватает

Как получить все значения (массив) колонки Column0_IndexTable1 ?

Смысл такой колонка Column0_IndexTable1 уникальна, соответственно нужно что бы числа были различны и желательно по порядку (в том числе при загрузке из xml). Если кто-то может предложить другое более удачное решение буду рад  smile 

Автор: MasterOfCode 22.10.2008, 12:55
Цитата(okaton @  22.10.2008,  13:58 Найти цитируемый пост)
Нужно получить все значения колонки Column0_IndexTable1 и создать условие. Если все числа в колонке идут по порядку, то добавить строку = последнее число + 1.  Если нет, то добавить строку с числом которого не хватает

[ИМХО]Сколько не сталкивался - это все глупости. Зачем тебе это? [/ИМХО]

Автор: okaton 22.10.2008, 13:22
Цитата(MasterOfCode @ 22.10.2008,  13:55)
Цитата(okaton @  22.10.2008,  13:58 Найти цитируемый пост)
Нужно получить все значения колонки Column0_IndexTable1 и создать условие. Если все числа в колонке идут по порядку, то добавить строку = последнее число + 1.  Если нет, то добавить строку с числом которого не хватает

[ИМХО]Сколько не сталкивался - это все глупости. Зачем тебе это? [/ИМХО]

Смысл такой колонка Column0_IndexTable1 уникальна, соответственно нужно что бы числа были различны и желательно по порядку (в том числе при загрузке из xml). Если кто-то может предложить другое более удачное решение буду рад  smile

P.S. в dataDridView2 отображаются данные опирающиеся на Column0_IndexTable1

P.P.S. Почему в 2008 студии не получается совершить такое действие:
Цитата

 Дважды щелкаем по файлу Settings.settings в Solution Explorer и добавляем настройку с некоторым именем (в данном примере с именем «ColsOrder») в список. В колонке «Type» настройки нужно указать «System.Int32[]» ...

в 2005 получается, как же это сделать в 2008  smile 

Автор: MasterOfCode 22.10.2008, 13:26
Выбирай максимальное и увеличивай на 1. Если будешь писать свой генератор ID на тех условиях что озвучил то он займет кучу времени чтоб выдать тебе нужную циферку, а оно надо пользователю, но мой взгляд пользователям без разницы в каком виде ты хранишь ID, лишь бы работало быстро. 
Да, и не мешало бы на каждый вопрос создавать свою тему.

Автор: okaton 22.10.2008, 13:30
Как я получу максимальное значение из колонки, если я не знаю как получить все значения колонки, а обращаться к каждой это наверное неправильно, хотя можно создать цикл  smile 

Автор: masel 11.1.2009, 08:23
Цитата

Добавь библиотеку в reference

Извеняюсь, за глупый вопрос но как?


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