Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
pasha_2001
0 / 0 / 0
Регистрация: 14.11.2012
Сообщений: 89
1

Обновить DataGridView при внесении данных через форму

29.11.2013, 12:47. Просмотров 2538. Ответов 5
Метки нет (Все метки)

Добрый день, Есть форма с DataGridView и кнопкой редактировать.
По нажатию кнопки появляется форма, которая берет все поля из выделенной на датагрид строки для редактирования.
После правки я сохраняю данные в базе, форма закрывается, но DataGridView естественно не апдейтится автоматом Можно кнопкой Обновить с кодом
C#
1
this.chempTableAdapter.Fill(this.dataSet1.chemp)
но необходимо сделать так, что бы по закрытии формы редактирования DGV обновлялся.
Пробовал Fiil дататэйбла закидывать в конец кода нажатия кнопки сохранить на форме редактирования, но ничего не помогает.Как сделать проще - чтото ничего толкового в инете не нашел
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.11.2013, 12:47
Ответы с готовыми решениями:

Добавление данных в dataGridView через вторую форму
Доброго вечерочка. Даны 2 формы: Форма 1: Форма 2: При нажатии на кнопку "Добавить" на форме 1,...

Не получается обновить данные в БД SQL Server при изменении данных в dataGridView
ADO.NET C# Добавлено через 2 минуты using System; using System.Collections.Generic; using...

Ошибка при внесении данных в Access
Необработанное исключение типа "System.Data.OleDb.OleDbException" в Session.dll Дополнительные...

Ошибка при внесении данных в таблицу БД
Начал обучение с БД. Создал локальную базу данных в Visual Studio 2013, создал таблицы. Хотел с...

Можно ли обновить данные таблицы через DataGridView?
Народ, скиньте пожалуйста пример или на пальцах объясните пожалуйста, как обновить данные в таблице...

5
wm_leviathan
198 / 199 / 70
Регистрация: 12.01.2011
Сообщений: 699
Завершенные тесты: 2
29.11.2013, 13:46 2
Вызовите метод Update для DataAdapter'а
0
pasha_2001
0 / 0 / 0
Регистрация: 14.11.2012
Сообщений: 89
29.11.2013, 14:06  [ТС] 3
По нажатию кнопки Сохранить в редактируемой форме вызываю
C#
1
2
3
4
chempTableAdapter.Update(dataSet1);
            this.dataSet1.chemp.AcceptChanges();
            
            this.Close();
Добавлено через 18 минут
Вот код формы с датагридом:
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
public partial class Main : Form
    {
        public Main()
        {
            InitializeComponent();
        }
 
        private void chempBindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
            this.Validate();
            this.chempBindingSource.EndEdit();
            this.tableAdapterManager.UpdateAll(this.dataSet1);
 
        }
 
        private void Main_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'dataSet1.chemp' table. You can move, or remove it, as needed.
            this.chempTableAdapter.Fill(this.dataSet1.chemp);
 
        }
 
        private void add_chemp_Click(object sender, EventArgs e)
        {
            Add_Chemp ac = new Add_Chemp();
            ac.ShowDialog();
        }
//кнопка Редактировать
        private void upd_chemp_Click(object sender, EventArgs e)
        {
            Upd_chemp uc = new Upd_chemp();
            uc.ShowDialog();
        }
//кнопка Обновить
        private void button1_Click(object sender, EventArgs e)
        {
            this.chempTableAdapter.Fill(this.dataSet1.chemp);
        }
А это с формой редактирования

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
public partial class Upd_chemp : Form
    {
        public Main mn;
 
        public Upd_chemp()
        {
            InitializeComponent();
            
        }
 
        //public Upd_chemp(Main main)
        //{
        //    InitializeComponent();
        //    mn = main;
        //}
 
 
        int pos = -1;
        private void Upd_chemp_Load(object sender, EventArgs e)
        {
            this.chempTableAdapter.Fill(this.dataSet1.chemp);
            this.regionsTableAdapter.Fill(this.dataSet1.regions);
 
            pos = this.BindingContext[dataSet1, "chemp"].Position;
            
            tb_Name.Text = dataSet1.chemp[pos].chemp_name;
            tb_Year.Text = Convert.ToString(dataSet1.chemp[pos].chemp_year);
 
            bool a = dataSet1.chemp[pos].chemp_end;
            if (a == true)
                cbChemp.Checked = false;
            else cbChemp.Checked = true; 
 
            tb_PDDchemptime.Text = Convert.ToString(dataSet1.chemp[pos].algPDDtime);
            tb_PDDchempPenalty.Text = Convert.ToString(dataSet1.chemp[pos].algPDDpenalty);
            tb_MDPchemptime.Text = Convert.ToString(dataSet1.chemp[pos].algMDPtime);
            tb_MDPchempPenalty.Text = Convert.ToString(dataSet1.chemp[pos].algMDPpenalty);
            tb_Figtime.Text = Convert.ToString(dataSet1.chemp[pos].algFIGUREtime);
            tb_FigPenalty.Text = Convert.ToString(dataSet1.chemp[pos].algFIGUREpenalty);
            tb_PDDkv.Text = dataSet1.chemp[pos].timePDD;
            tb_MDPkv.Text = dataSet1.chemp[pos].timeMDP;
            tb_Figkv.Text = dataSet1.chemp[pos].timeFIGURE;
            tb_PDDmax.Text = Convert.ToString(dataSet1.chemp[pos].maxPDD);
            tb_MDPmax.Text = Convert.ToString(dataSet1.chemp[pos].maxMDP);
            tb_Figmax.Text = Convert.ToString(dataSet1.chemp[pos].maxFIGURE);
            tb_Orbitr1dolz.Text = dataSet1.chemp[pos].chemp_orbitr0_dolz;
            tb_Orbitr1FIO.Text = dataSet1.chemp[pos].chemp_orbitr0_fio;
            tb_Orbitr2dolz.Text = dataSet1.chemp[pos].chemp_orbitr1_dolz;
            tb_Orbitr2FIO.Text = dataSet1.chemp[pos].chemp_orbitr1_fio;
            cb_region.DisplayMember = Convert.ToString(dataSet1.chemp[pos].region_id);
                       
        } 
        
        private void btnOk_Click(object sender, EventArgs e)
        {
            DataRow rowChemp = this.dataSet1.chemp[pos];
            
            rowChemp["chemp_name"] = tb_Name.Text;
            rowChemp["chemp_year"] = Convert.ToInt32(tb_Year.Text);
 
            if (cbChemp.Checked)
                rowChemp["chemp_end"] = 1;
            else rowChemp["chemp_end"] = 0;
 
            rowChemp["algPDDtime"] = Convert.ToDouble(tb_PDDchemptime.Text);
            rowChemp["algPDDpenalty"] = Convert.ToDouble(tb_PDDchempPenalty.Text);
            rowChemp["algMDPtime"] = Convert.ToDouble(tb_MDPchemptime.Text);
            rowChemp["algMDPpenalty"] = Convert.ToDouble(tb_MDPchempPenalty.Text);
            rowChemp["algFIGUREtime"] = Convert.ToDouble(tb_Figtime.Text);
            rowChemp["algFIGUREpenalty"] = Convert.ToDouble(tb_FigPenalty.Text);
            rowChemp["timePDD"] = tb_PDDkv.Text;
            rowChemp["timeMDP"] = tb_MDPkv.Text;
            rowChemp["timeFIGURE"] = tb_Figkv.Text;
            rowChemp["maxPDD"] = Convert.ToInt16(tb_PDDmax.Text);
            rowChemp["maxMDP"] = Convert.ToInt16(tb_MDPmax.Text);
            rowChemp["maxFIGURE"] = Convert.ToInt16(tb_Figmax.Text);
            rowChemp["chemp_orbitr0_dolz"] = tb_Orbitr1dolz.Text;
            rowChemp["chemp_orbitr0_fio"] = tb_Orbitr1FIO.Text;
            rowChemp["chemp_orbitr1_dolz"] = tb_Orbitr2dolz.Text;
            rowChemp["chemp_orbitr1_fio"] = tb_Orbitr2FIO.Text;
            rowChemp["region_id"] = cb_region.SelectedValue;
            chempTableAdapter.Update(dataSet1);
            this.dataSet1.chemp.AcceptChanges();
            
            this.Close();
        }
 
        private void btnCancell_Click(object sender, EventArgs e)
        {
            this.Close();
        }
0
Павлик Морозов
119 / 121 / 39
Регистрация: 26.10.2012
Сообщений: 410
Завершенные тесты: 1
29.11.2013, 22:09 4
pasha_2001, Если я правильно понял, то при сохранении новой записи/редактировании существующей, ты заново перезаполняешь весь DataGridView. Я далеко не спец C#, но считаю что такой подход - убойнейший по своей эпичности костыль.
Что тебе мешает:
1) сделать единую форму для создания/редактирования записей из грида?
2) в форме создания/редактирования создай 2 события
C#
1
2
public event EventHandler CreatedElement;
public event EventHandler UpdatedElement;
при открытии формы просто подписывайся на эти события, и при их наступлении вылавливай из источника измененные строки, меняй/добавляй соответствующую строку в DGV, потом уже делай AcceptChanges. Твоя схема хороша, когда мало записей, а если их 10К, 100К? Каждый раз все перерисовывать?
0
pasha_2001
0 / 0 / 0
Регистрация: 14.11.2012
Сообщений: 89
30.11.2013, 11:52  [ТС] 5
а можно с примером?
0
Павлик Морозов
119 / 121 / 39
Регистрация: 26.10.2012
Сообщений: 410
Завершенные тесты: 1
30.11.2013, 14:13 6
pasha_2001, примерно так выглядит:
Код формы с гридом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//Открываем форму для создания элемента
public void CreateBtn_Click(object sender,EventArgs e)
{
using(ElementForm frm = new ElementForm(1)) //параметр 1 означает что создаем новый элемент
{
   frm.CreatedElement += new EventHandler(Created_Element); //Обработчик события расположен в коде формы с гридом
   frm.ShowDialog();
}
}
//Открываем форму для редактирования элемента
public void EditBtn_Click(object sender,EventArgs e)
{
using(ElementForm frm = new ElementForm(2)) //параметр 2 означает что редактируем существующий элемент
{
   frm.UpdatedElement += new EventHandler(Updated_Element); //Обработчик события расположен в коде формы с гридом
   frm.ShowDialog();
}
}
Код формы элемента выглядит примерно так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class ElementForm : Form
{
   bool created;
   public event EventHandler CreatedElement;
   public event EventHandler UpdatedElement;
   public ElementForm(int oper)
   {
      created= (oper == 1);
   }
   //Какие-то методы по заполнению данных
   ......
   //Сохраняем данные
   public void Save()
   {
      //Сохраняем данные в Dataset, потом инициализируем нужное событие
      if(created)
         CreatedElement(this, new EventArgs());
      else
         UpdatedElement(this, new EventArgs());
   }
}
Здесь обработчики событий создания/обновления
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void Created_Element(object sender, EventArgs e)
{
//получаем добавленную строку
Datarow _row = _myset.Tables["МояТаблица"].Rows.OfType<DataRow>().First(t=>t.RowState==DataRowState.Added);
DGV.Rows.Add();
//заносим данные из _row в DGV
_myset.AcceptChanges();
}
 
public void Updated_Element(object sender, EventArgs e)
{
//получаем обновленную строку
Datarow _row = _myset.Tables["МояТаблица"].Rows.OfType<DataRow>().First(t=>t.RowState==DataRowState.Modified);
//Получаем индекс обновленной строки
int _rowindex = _myset.Tables["МояТаблица"].Rows.IndexOf(_row);
//заносим данные из _row в DGV по полученному индексу строки
_myset.AcceptChanges();
}
Примерно так... это на скорую руку примерчик, что бы понять идею, которую я тебе описал. Будут вопросы пиши.
P.S. Не забудь добавить пространство имен System.Linq;
2
30.11.2013, 14:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2013, 14:13

Ошибка при редактировании данных через DataGridView
Ошибка при редактировании данных через DataGridView. Я создал таблицу с полем id, которое является...

Редактирование DataGridView через форму
Здравствуйте, я столкнулся с такой проблемой ,у меня имеется 2 таблицы Модули и Дисциплины ,...

Обновить второй dataGridView при выборе строки в первом (Клиенты -> Контакты)
на форме имеется две таблицы dataGridView. данные в этих таблицах отображается из БД SQL Server....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru