powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не работает реляция
25 сообщений из 26, страница 1 из 2
Не работает реляция
    #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
Не работает реляция
    #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
Не работает реляция
    #38261856
Фотография Mikhail Tchervonenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenko,

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

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

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

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

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

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

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

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

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

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

раз уж знатоки зашли может Вы можете и на этот вопрос ответить. а то до сих пор полное молчание :(
...
Рейтинг: 0 / 0
Не работает реляция
    #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
Не работает реляция
    #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
Не работает реляция
    #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
Не работает реляция
    #38262190
Фотография Mikhail Tchervonenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,
точно, этот момент в случае листбокса упустил.

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

реляция создаётся с целью отображения связанных с головной таблицей, данных из подчинённой таблицы.При чём здесь листбокс? Русским языком же написано: "Свойству DataMember второго источника BindingSource присвоено имя DataRelation ."
...
Рейтинг: 0 / 0
Не работает реляция
    #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
Не работает реляция
    #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
Не работает реляция
    #38262216
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenkopation,

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

Спасибо.

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

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

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

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

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


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