Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не работает реляция / 25 сообщений из 26, страница 1 из 2
17.05.2013, 12:58
    #38261796
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
Доброе время суток!

Есть 2 таблицы USER и USER_GRUPPE. Связаннные полями USER.SATZ_ID = USER_GRUPPE.USER_SATZ_ID.

Следующий код создаёт реляцию и заполняет грид головной таблицы и листбокс подчинённой.
Проблема в том что при выборе записи в гриде головной таблицы не происходит отображение соотв. записей в подчинённом листбоксе. Что неправильно сделал? ошибки не происходит.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
                // создаю список пользователей для грида (родительская таблица)
                this.components = new System.ComponentModel.Container();
                conn_USER = new SqlConnection();
                conn_USER.ConnectionString = DBS.ConnectionStringKD;
                cmd_USER = new SqlCommand("SELECT * FROM USER WHERE MANDANT = " + Convert.ToString(DBS.E_MD), conn_USER);
                da_USER = new SqlDataAdapter(cmd_USER);
                cb_USER = new SqlCommandBuilder(da_USER);
                ds_USER = new DataSet();
                da_USER.Fill(ds_USER, "USER"); //,
                bs_USER = new BindingSource(ds_USER, "USER");

                // Создаю набор данных для листбокса (подчинённая таблица - список групп в которых находится пользователь)
                cmd_USER_GRUPPE =
                    new SqlCommand(
                        "SELECT USER_GRUPPE.SATZ_ID, USER_SATZ_ID, GROUP_SATZ_ID, (SELECT GRUPPE FROM GRUPPE WHERE GROUP_SATZ_ID=GRUPPE.SATZ_ID) as GRUPPE FROM USER_GRUPPE WHERE MANDANT = " +
                        Convert.ToString(DBS.E_MD),
                        conn_USER); 
                da_USER_GRUPPE = new SqlDataAdapter(cmd_USER_GRUPPE);
                cb_USER_GRUPPE = new SqlCommandBuilder(da_USER_GRUPPE);
                da_USER_GRUPPE.Fill(ds_USER, "USER_GRUPPE");
                bs_USER_GRUPPE = new BindingSource(ds_USER, "USER_GRUPPE");


                // Создаю реляцию
                dr_USER = new DataRelation("USER_TO_GRUPPE",ds_USER.Tables["USER"].Columns["SATZ_ID"],ds_USER.Tables["USER_GRUPPE"].Columns["USER_SATZ_ID"]);
                ds_USER.Relations.Add(dr_USER);

                //  Заполняю листбокс  списком групп в которых находится пользователь
                lst_USER_GRUPPE.DataSource = (bs_USER.Current as DataRowView).CreateChildView("USER_TO_GRUPPE");
                lst_USER_GRUPPE.DisplayMember = "GRUPPE";
                lst_USER_GRUPPE.ValueMember = "SATZ_ID";
                
               // Заполняю грид списком пользователей
               grid_USER.DataSource = bs_USER;



Спасибо
...
Рейтинг: 0 / 0
17.05.2013, 13:19
    #38261850
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
Mikhail Tchervonenko,
Проблему решил добавив приведённый ниже код в событие головного источника данных
bs_MD_USER.PositionChanged += new System.EventHandler(this.OnPositionChanged)

Код: c#
1.
2.
3.
4.
5.
6.
        private void OnPositionChanged(object sender, EventArgs e)
        {
                lst_USER_GRUPPE.DataSource = (bs_USER.Current as DataRowView).CreateChildView("USER_TO_GRUPPE");
                lst_USER_GRUPPE.DisplayMember = "GRUPPE";
                lst_USER_GRUPPE.ValueMember = "SATZ_ID";
        }        



Походу автоматического отслеживания транзакций между головной и подчинённой таблицей в шарпе не предусмотрено. Или я ошибаюсь?

Спасибо.
...
Рейтинг: 0 / 0
17.05.2013, 13:21
    #38261856
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
Mikhail Tchervonenko,

очепятка
bs_USER.PositionChanged += new System.EventHandler(this.OnPositionChanged)
...
Рейтинг: 0 / 0
17.05.2013, 13:28
    #38261875
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
Mikhail TchervonenkoИли я ошибаюсь?
вы ошибаетесь во всём

-используете непонятные слова (реляция - что это?)
-не используете дал
-не знаете что такое транзакция

знания можно получить прочитав пару умных книжек, тема по книжкам поднималась на форуме
...
Рейтинг: 0 / 0
17.05.2013, 13:34
    #38261898
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
pation,

При чем тут транзакция, я тут пока не изменяю данные а только отображаю?
Про реляции читайте тут .
А вто что такое "Дал" теперь не знаю уже я, не расшифруете? или ссылочку пожалуйста.

Спасибо.
...
Рейтинг: 0 / 0
17.05.2013, 13:36
    #38261908
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
Mikhail Tchervonenko,

Data Access Layer?
...
Рейтинг: 0 / 0
17.05.2013, 13:38
    #38261916
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
Mikhail Tchervonenkopation,

При чем тут транзакция, я тут пока не изменяю данные а только отображаю?
Про реляции читайте тут .И что нам там читать? Что Relation переводится как Отношение?
Mikhail TchervonenkoА вто что такое "Дал" теперь не знаю уже я, не расшифруете? или ссылочку пожалуйста.

Спасибо. Data Access Layer (DAL) . Обратите внимание на раздел External links в статье. Вам будет полезно почитать.
...
Рейтинг: 0 / 0
17.05.2013, 13:39
    #38261920
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
Mikhail TchervonenkoПри чем тут транзакция, я тут пока не изменяю данные а только отображаю?
Mikhail TchervonenkoПоходу автоматического отслеживания транзакций между головной и подчинённой таблицей в шарпе не предусмотрено.
...
Рейтинг: 0 / 0
17.05.2013, 13:40
    #38261922
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
pation,
сорри, это быля опечатка. Реляций разумеется.
...
Рейтинг: 0 / 0
17.05.2013, 13:41
    #38261928
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
Депеляций
...
Рейтинг: 0 / 0
17.05.2013, 13:47
    #38261946
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
Mikhail TchervonenkoПоходу автоматического отслеживания транзакций между головной и подчинённой таблицей в шарпе не предусмотрено. Или я ошибаюсь?Походу у Вас проблемы не только с английским, но и с MSDN.

Практическое руководство. Отображение главного и подчиненного представлений данных с использованием двух элементов управления DataGridView в Windows Forms.
...
Рейтинг: 0 / 0
17.05.2013, 13:53
    #38261961
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
skyANA,

спасибо за ссылочку, я там уже был когда начинал этот код но использовать BindingSource тогда не планировал (т.к. редактировать данные не планировал). Потом всетаки к нему пришел а про этот пример не вспомнил. Каюсь.
...
Рейтинг: 0 / 0
17.05.2013, 13:55
    #38261966
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
skyANA,

раз уж знатоки зашли может Вы можете и на этот вопрос ответить. а то до сих пор полное молчание :(
...
Рейтинг: 0 / 0
17.05.2013, 14:49
    #38262102
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
skyANA,

Прикольно. Зделал все как в примере с MSDN в случае двух гридов все работает а если головной грид и подчинённый ListBox то нет.

В случае подчинённого грида так работает.
Код: c#
1.
2.
3.
4.
5.
6.
                grid_MD_USER_GRUPPE.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                grid_MD_USER_GRUPPE.AllowUserToAddRows = false;
                grid_MD_USER_GRUPPE.AutoGenerateColumns = false;
                grid_MD_USER_GRUPPE.ReadOnly = true;
                grid_MD_USER_GRUPPE.AddTextColumn("GRUPPE", "Gruppe"); // свой метод добавляет колонку с заголовком
                grid_MD_USER_GRUPPE.DataSource = bs_MD_USER_GRUPPE;


а в случае ListBox работает только если этот код ещё привязать к событию перемещения по записе в головном BindingSource
Код: c#
1.
2.
3.
                lst_MD_USER_GRUPPE.DataSource = bs_MD_USER_GRUPPE;
                lst_MD_USER_GRUPPE.DisplayMember = "GRUPPE";
                lst_MD_USER_GRUPPE.ValueMember = "SATZ_ID";


По идее вопрос решен но хочется разобраться в чем проблема с ListBox. Возможно забыл какоето свойство ещё определить?
...
Рейтинг: 0 / 0
17.05.2013, 14:54
    #38262118
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
а в случае подчинённого текстбокса работает.
там правда подключаю так:
Код: c#
1.
2.
                txtGRUPPE.DataBindings.Add(new Binding("Text", bs_MD_USER_GRUPPE, "GRUPPE"));
                txtGRUPPE.EnableFrom = bs_MD_USER;


А можно ли через Binding и листбокс подцепить?
...
Рейтинг: 0 / 0
17.05.2013, 15:02
    #38262137
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
Mikhail TchervonenkoskyANA,

Прикольно. Зделал все как в примере с MSDN в случае двух гридов все работает а если головной грид и подчинённый ListBox то нет.

В случае подчинённого грида так работает.
Код: c#
1.
2.
3.
4.
5.
6.
                grid_MD_USER_GRUPPE.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                grid_MD_USER_GRUPPE.AllowUserToAddRows = false;
                grid_MD_USER_GRUPPE.AutoGenerateColumns = false;
                grid_MD_USER_GRUPPE.ReadOnly = true;
                grid_MD_USER_GRUPPE.AddTextColumn("GRUPPE", "Gruppe"); // свой метод добавляет колонку с заголовком
                grid_MD_USER_GRUPPE.DataSource = bs_MD_USER_GRUPPE;


а в случае ListBox работает только если этот код ещё привязать к событию перемещения по записе в головном BindingSource
Код: c#
1.
2.
3.
                lst_MD_USER_GRUPPE.DataSource = bs_MD_USER_GRUPPE;
                lst_MD_USER_GRUPPE.DisplayMember = "GRUPPE";
                lst_MD_USER_GRUPPE.ValueMember = "SATZ_ID";


По идее вопрос решен но хочется разобраться в чем проблема с ListBox. Возможно забыл какоето свойство ещё определить?
Возможно Вы забыли статью прочитать?
MSDNСвойству DataMember второго источника BindingSource присвоено имя DataRelation. Это заставляет связанный подчиненный элемент управления DataGridView отображать строки дочерней таблицы Orders, соответствующие текущей строке главного элемента управления DataGridView.
Не вижу у Вас второго источника, которому присвоено имя DataRelation. Вы вообще с какой целью "реляцию" создаёте?
...
Рейтинг: 0 / 0
17.05.2013, 15:29
    #38262190
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
skyANA,
точно, этот момент в случае листбокса упустил.

реляция создаётся с целью отображения связанных с головной таблицей, данных из подчинённой таблицы.
...
Рейтинг: 0 / 0
17.05.2013, 15:34
    #38262201
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
Mikhail TchervonenkoskyANA,
точно, этот момент в случае листбокса упустил.

реляция создаётся с целью отображения связанных с головной таблицей, данных из подчинённой таблицы.При чём здесь листбокс? Русским языком же написано: "Свойству DataMember второго источника BindingSource присвоено имя DataRelation ."
...
Рейтинг: 0 / 0
17.05.2013, 15:34
    #38262204
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
Mikhail Tchervonenko,

хотя стоп, я как раз для листбокса и использую тот же источник что для подцинённого грида и там реляция прописана. Только в случае гради она отрабатывается автоматом при перемещении по головному источнику а у листбокса нет.
Код: c#
1.
2.
3.
4.
5.
6.
                // Create Relation
                dr_MD_USER = new DataRelation("USER_TO_GRUPPE", ds_MD_USER.Tables["MD_USER"].Columns["SATZ_ID"], ds_MD_USER.Tables["MD_USER_GRUPPE"].Columns["USER_SATZ_ID"]);
                ds_MD_USER.Relations.Add(dr_MD_USER);

                bs_MD_USER = new BindingSource(ds_MD_USER, "MD_USER"); // источник для головного грида
                bs_MD_USER_GRUPPE = new BindingSource(bs_MD_USER, "USER_TO_GRUPPE"); // а это для подчинённого грида или листбокса
...
Рейтинг: 0 / 0
17.05.2013, 15:37
    #38262211
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
Взял пример из MSDN, закомментировал detailsDataGridView добавил detailsListBox:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace DataRelationApplication
{
    public partial class Form1 : Form
    {
        private BindingSource masterBindingSource = new BindingSource();
        private DataGridView masterDataGridView = new DataGridView();
        private BindingSource detailsBindingSource = new BindingSource();
        // private DataGridView detailsDataGridView = new DataGridView();
        private ListBox detailsListBox = new ListBox();

        public Form1()
        {
            masterDataGridView.Dock = DockStyle.Fill;
            // detailsDataGridView.Dock = DockStyle.Fill;
            detailsListBox.Dock = DockStyle.Fill;

            SplitContainer splitContainer1 = new SplitContainer();
            splitContainer1.Dock = DockStyle.Fill;
            splitContainer1.Orientation = Orientation.Horizontal;
            splitContainer1.Panel1.Controls.Add(masterDataGridView);
            // splitContainer1.Panel2.Controls.Add(detailsDataGridView);
            splitContainer1.Panel2.Controls.Add(detailsListBox);

            this.Controls.Add(splitContainer1);
            this.Text = "DataGridView master/detail demo";
        }

        protected override void OnLoad(System.EventArgs e)
        {
            base.OnLoad(e);

            // Bind the DataGridView controls to the BindingSource components and load the data from the database.
            masterDataGridView.DataSource = masterBindingSource;
            // detailsDataGridView.DataSource = detailsBindingSource;

            GetData();

            detailsListBox.DataSource = detailsBindingSource;
            detailsListBox.DisplayMember = "SalesOrderNumber";
            detailsListBox.ValueMember = "SalesOrderID";

            // Resize the master DataGridView columns to fit the newly loaded data.
            masterDataGridView.AutoResizeColumns();

            // Configure the details DataGridView so that its columns automatically adjust their widths when the data changes.
            // detailsDataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
        }

        private void GetData()
        {
            try
            {
                // Specify a connection string. Replace the given value with a valid connection string for a Northwind SQL Server sample database accessible to your system.
                var connectionString = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=AdventureWorks;Data Source=localhost";
                SqlConnection connection = new SqlConnection(connectionString);

                // Create a DataSet.
                var data = new DataSet { Locale = System.Globalization.CultureInfo.InvariantCulture };

                // Add data from the Customers table to the DataSet.
                var masterDataAdapter = new SqlDataAdapter("select * from Sales.Customer where CustomerID > 10999", connection);
                masterDataAdapter.Fill(data, "Customers");

                // Add data from the Orders table to the DataSet.
                var detailsDataAdapter = new SqlDataAdapter("select * from Sales.SalesOrderHeader", connection);
                detailsDataAdapter.Fill(data, "Orders");

                // Establish a relationship between the two tables.
                var relation = new DataRelation("CustomersOrders", data.Tables[ "Customers" ].Columns[ "CustomerID" ], data.Tables[ "Orders" ].Columns[ "CustomerID" ]);
                data.Relations.Add(relation);

                // Bind the master data connector to the Customers table.
                masterBindingSource.DataSource = data;
                masterBindingSource.DataMember = "Customers";

                // Bind the details data connector to the master data connector,
                // using the DataRelation name to filter the information in the details table based on the current row in the master table.
                detailsBindingSource.DataSource = masterBindingSource;
                detailsBindingSource.DataMember = "CustomersOrders";
            }
            catch (SqlException)
            {
                MessageBox.Show("To run this example, replace the value of the connectionString variable with a connection string that is valid for your system.");
            }
        }
    }
}
...
Рейтинг: 0 / 0
17.05.2013, 15:39
    #38262216
monstrU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
Mikhail Tchervonenkopation,

При чем тут транзакция, я тут пока не изменяю данные а только отображаю?
Про реляции читайте тут .
А вто что такое "Дал" теперь не знаю уже я, не расшифруете? или ссылочку пожалуйста.

Спасибо.

Слово «реляционный» происходит от англ. relation (отношение[1]). Для работы с реляционными БД применяют реляционные СУБД.
реляция и реляционный одно и то же ? relation - это я еще понимаю.
задавайте вопросы на правильном русском, честное слово
...
Рейтинг: 0 / 0
17.05.2013, 16:00
    #38262276
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
skyANA,

с ListBox этот пример не работает :(
только если как я писал выше привязывать к событию смены записи в головном источнике к присвоению datasource у листбокса.
...
Рейтинг: 0 / 0
17.05.2013, 16:08
    #38262288
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
Mikhail Tchervonenko,

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

Может кто то может показать как это сделать?
...
Рейтинг: 0 / 0
17.05.2013, 16:11
    #38262295
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
Mikhail Tchervonenko, я же Вам уже код с ListBox привёл. У меня лично он работает.
...
Рейтинг: 0 / 0
17.05.2013, 16:21
    #38262315
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает реляция
skyANA,

блин, ну ладно, буду рыть пока причину не найду, возможно что то упустил.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не работает реляция / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]