Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / TableAdapter -> DataTable -> DataView -> DataGrid / 7 сообщений из 7, страница 1 из 1
18.11.2009, 17:38
    #36318049
TableAdapter -> DataTable -> DataView -> DataGrid
Здравствуйте !

Изменяю, добавляю, удаляю поля в DataGrid в вышеуказанной связке, но при попытке получить измененные данные ничего не получаю....

Так же в программе есть связка TableAdapter->DataTable->BindingSource->TextBox'ы . Опять же при любого рода модификациях не получаю никакие строки...

Такое ощущение что где-то автоматически вызывается AcceptChanges() или еще чего.... никак не могу понять причину...

Буду благодарен за любую предоставленную помощь !
...
Рейтинг: 0 / 0
18.11.2009, 17:53
    #36318106
stimpi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TableAdapter -> DataTable -> DataView -> DataGrid
выложите код, а то получается: "написал программу все делаю как надо, а оно чего-то не работает. В чем причина ?"
...
Рейтинг: 0 / 0
19.11.2009, 03:14
    #36318661
TableAdapter -> DataTable -> DataView -> DataGrid
Все таблицы, связи, адаптеры и ДатаСет создаются у меня с помощью визарда. Но из всех таблиц только одна завязана на BindingSource в TextBox'ы, остальные через DataView напрямую в DataGridView. Апдейт этих таблиц я пытаюсь делать при помощи tableAdapterManager.UpdateAll(), но так как у всех измененных строк RowState каким-то образом всегда изменяется на unchanged, адаптер соответственно ничего не обновляет...
Могу еще добавить то, что статус строки меняется всегда сразу же после ее добавления, изменеия...

Далее привожу некоторый код...

Код: plaintext
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.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
private void Form1_Load(object sender, EventArgs e)
        {
            this.statE_EXAMTableAdapter1.Fill(this.commonDS1.STATE_EXAM);
            this.yearlY_PROJECTTableAdapter1.Fill(this.commonDS1.YEARLY_PROJECT);
            this.pRACTICSTableAdapter.Fill(this.commonDS1.PRACTICS);
            this.cOMMON_STUDENT_PLANTableAdapter.Fill(this.commonDS1.COMMON_STUDENT_PLAN);            
            this.tRANSFERSTableAdapter.Fill(this.commonDS1.TRANSFERS);
            this.sTUDENTTableAdapter.Fill(this.commonDS1.STUDENT);
            this.sTUDY_PROFILETableAdapter.Fill(this.commonDS1.STUDY_PROFILE);        
            

            dvTransfers = new DataView(commonDS1.Tables["TRANSFERS"]);
            dvTransfers.RowFilter = "STUDENT_ID='" + sTUDENT_IDTextBox.Text+"'";
            dvTransfers.ListChanged += new ListChangedEventHandler(dvsStudentIdInsert_ListChanged);
            transfersGrid.DataSource = dvTransfers;
            transfersGrid.Columns[4].Visible = false;
            transfersGrid.Columns[0].HeaderText = "Номер приказа";
            transfersGrid.Columns[1].HeaderText = "Дата приказа";
            transfersGrid.Columns[2].HeaderText = "Курс";
            transfersGrid.Columns[3].HeaderText = "Содержание приказа";
            transfersGrid.Columns[3].Width = 170;
            dvCommon_SP = new DataView(commonDS1.Tables["COMMON_STUDENT_PLAN"]);
            dvCommon_SP.RowFilter = "STUDENT_ID='" + sTUDENT_IDTextBox.Text + 
                                    "' AND SEMESTER='"+(semestrBox.SelectedIndex+1)+"'";
            dvCommon_SP.ListChanged+=new ListChangedEventHandler(dvCommon_SP_ListChanged);
            dataGridView1.DataSource = dvCommon_SP;
            dataGridView1.Columns[0].Visible = false;
            dataGridView1.Columns[1].Visible = false;
            dataGridView1.Columns[2].Visible = false;
            SetColumnsWidth(dataGridView1, 0, 0, 0, 210, 70, 50, 50, 100);

            additional = new DataView(commonDS1.Tables["PRACTICS"]);
            additional.RowFilter = "STUDENT_ID='" + sTUDENT_IDTextBox.Text + "'";
            additional.ListChanged += new ListChangedEventHandler(dvsStudentIdInsert_ListChanged);
            dataGridView2.DataSource = additional;
            dataGridView2.Columns[1].Visible = false;
            SetColumnsWidth(dataGridView2, 29, 0, 158, 157, 52, 90);

            currentStudentRow = ((DataRowView)sTUDENTBindingSource.Current).Row;
            DiplomaThemeValidate();
        }

        private void SetColumnsWidth(DataGridView dgv, params int[] columns)
        {
            for (int i = 0; i < columns.Length; i++)
                dgv.Columns[i].Width = columns[i];
        }

        private void DiplomaThemeValidate()
        {
            if (dIPLOMA_THEMETextBox.Text.Length > 0)
            {
                dIPLOMA_MARKComboBox.Enabled = true;
                qUALIFICATION_PROTTextBox.Enabled = true;
                qUALIFICATION_DATEMaskedTextBox.Enabled = true;
            }
            else
            {
                dIPLOMA_MARKComboBox.Enabled = false;
                qUALIFICATION_PROTTextBox.Enabled = false;
                qUALIFICATION_DATEMaskedTextBox.Enabled = false;
            }
        }

        private void bindingNavigatorMoveItem_Click(object sender, EventArgs e)
        {
            currentStudentRow = ((DataRowView)sTUDENTBindingSource.Current).Row;
            rowFak_spec = currentStudentRow.GetParentRow(commonDS1.Relations["FK_STUDENT_1"]);
            fACULTYTextBox.Text = rowFak_spec["FACULTY"].ToString();
            sPECIALITYTextBox.Text = rowFak_spec["SPECIALITY"].ToString();
            qUALIFICATIONTextBox.Text = rowFak_spec["QUALIFICATION"].ToString();
            dvTransfers.RowFilter = "STUDENT_ID='" + sTUDENT_IDTextBox.Text + "'";
            DiplomaThemeValidate();
        }

        private void dvsStudentIdInsert_ListChanged(object sender, ListChangedEventArgs e)
        {
            if (e.ListChangedType == ListChangedType.ItemAdded)
            {
                ((DataView)sender)[e.NewIndex].Row["STUDENT_ID"] = int.Parse(sTUDENT_IDTextBox.Text);
                MessageBox.Show(((DataView)sender)[e.NewIndex].Row.RowState.ToString());
            }
        }

        private void dvCommon_SP_ListChanged(object sender, ListChangedEventArgs e)
        {
            if (e.ListChangedType == ListChangedType.ItemAdded)
            {
                DataRow newRow = dvCommon_SP[e.NewIndex].Row;
                newRow["STUDENT_ID"] = int.Parse(sTUDENT_IDTextBox.Text);
                newRow["SEMESTER"] = semestrBox.SelectedIndex + 1;
                MessageBox.Show(newRow.RowState.ToString());
            }
        }

        private void saveChangesToolStripMenuItem_Click(object sender, EventArgs e)
        {           
            
            int i=tableAdapterManager.UpdateAll(commonDS1);
            MessageBox.Show(i.ToString());
        }

Еще можно отметить то, что ListChanged вызывается у меня и для строки со статусом Detached, а потом для этой же самой строки, перешедшей в статус Added...
...
Рейтинг: 0 / 0
19.11.2009, 12:01
    #36319312
stimpi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TableAdapter -> DataTable -> DataView -> DataGrid
Чистяк Константин Но из всех таблиц только одна завязана на BindingSource в TextBox'ы, остальные через DataView напрямую в DataGridView

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

Надо при изменении строки в гридеобновлять биндинг на новый объект, выбранный в гриде, тогда изменения в текстбоксах будут влиять на таблицу.
...
Рейтинг: 0 / 0
19.11.2009, 12:27
    #36319411
stimpi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TableAdapter -> DataTable -> DataView -> DataGrid
Да кстати, есть одна особенность, состояние строки не меняется пока не вызывается метод DataRow.EndEdit(), а он вызывается только при смене выбора в гриде, поэтому его надо принудительно вызывать.
Код: plaintext
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.
private void Form1_Load(object sender, EventArgs e)
        {
            DataTable table = new DataTable("source");
            DataColumn clnID = new DataColumn("ID", typeof(int));
            DataColumn clnName = new DataColumn("Name", typeof(string));
            DataColumn clnLName = new DataColumn("LastName", typeof(string));

            table.Columns.AddRange(new DataColumn[]{clnID, clnName, clnLName});
            DataRow row = table.NewRow();
            row["ID"] = 1;
            row["Name"] = "Anonymous";
            row["LastName"] = "Dow";
            table.Rows.Add(row);

            row = table.NewRow();
            row["ID"] = 2;
            row["Name"] = "Sarah";
            row["LastName"] = "Connor";
            table.Rows.Add(row);

            table.AcceptChanges();


            dataGridView1.DataSource = table.DefaultView;
            currentRow = (DataRowView)dataGridView1.CurrentRow.DataBoundItem;
            BindData();
        }

        DataRowView currentRow = null;

        private void BindData()
        {
            if (currentRow == null)
                return;

            txtID.DataBindings.Clear();
            txtID.DataBindings.Add("Text", currentRow, "ID", true, DataSourceUpdateMode.OnPropertyChanged);
            txtName.DataBindings.Clear();
            txtName.DataBindings.Add("Text", currentRow, "Name", true, DataSourceUpdateMode.OnPropertyChanged);
            txtLastName.DataBindings.Clear();
            txtLastName.DataBindings.Add("Text", currentRow, "LastName", true, DataSourceUpdateMode.OnPropertyChanged);
        }

        private void dataGridView1_SelectionChanged(object sender, EventArgs e)
        {
            currentRow = (DataRowView)dataGridView1.CurrentRow.DataBoundItem;
            BindData();
        }

        private void txtID_Leave(object sender, EventArgs e)
        {
            currentRow.Row.EndEdit();
        }

        private void txtName_Leave(object sender, EventArgs e)
        {
            currentRow.Row.EndEdit();
        }

        private void txtLastName_Leave(object sender, EventArgs e)
        {
            currentRow.Row.EndEdit();
        }
...
Рейтинг: 0 / 0
19.11.2009, 14:12
    #36319807
TableAdapter -> DataTable -> DataView -> DataGrid
Немного не так...

Все имеющиеся TextBox'ы привязаны к studentBindingSource(визардом), а во всех DataGridView источником являются DataView на другие таблицы (у них имеется FK STUDENT_ID) с фильтром по текущему идентифекатору (STUDENT_ID в studentBindingSource). К studentBindingSource имеется навигатор, у которого обрабатываются события перемещения (в вышеприведенном методе bindingNavigatorMoveItem_Click).
...
Рейтинг: 0 / 0
19.11.2009, 14:55
    #36319922
stimpi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TableAdapter -> DataTable -> DataView -> DataGrid
принудительно вызови метод DataRow.EndEdit() и посмотри на результат.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / TableAdapter -> DataTable -> DataView -> DataGrid / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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