2 / 2 / 2
Регистрация: 02.06.2017
Сообщений: 63
1
.NET 4.x

Редактирование dataGridView в новой форме при DoubleClick

20.09.2017, 16:46. Показов 2220. Ответов 4

Author24 — интернет-сервис помощи студентам
Добрый день!
Имеется форма, на ней dataGridView. Имеется вторая форма, из которой данные вносятся в первую:
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
    public partial class FormAddCountry : Form
    {
        SqlCommand cmd;
        SqlConnection con;
        public FormAddCountry()
        {
            InitializeComponent();
        }
 
        //Нажали "Сохранить"
        private void ButtonSave_Click_1(object sender, EventArgs e)
        {
            con = new SqlConnection(@"Data Source=localhost\SQLEXPRESS;Initial Catalog=GuardianSoftDB;Integrated Security=True");
            Console.WriteLine("Соединение успешно произведено");
            con.Open();
            cmd = new SqlCommand("INSERT INTO GSDBCountries (sName) VALUES (@sName)", con);
            SqlDataAdapter da = new SqlDataAdapter();
            cmd.Parameters.AddWithValue("@sName", textBox1.Text);
            this.gSDBCountriesTableAdapter.Fill(this.countries.GSDBCountries);
            da.SelectCommand = cmd;
            cmd.ExecuteNonQuery();
            con.Close();
            Close();
        }
 
        //Нажали "Отмена"
        private void ButtonCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }
 
        //Загружена форма - обновляем TableAdapter
        private void FormAddCountry_Load(object sender, EventArgs e)
        {
            this.gSDBCountriesTableAdapter.Fill(this.countries.GSDBCountries);
        }
 
        //Закрывается форма - обновляем TableAdapter
        private void FormAddCountry_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.gSDBCountriesTableAdapter.Fill(this.countries.GSDBCountries);
        }
 
        //Закрыта форма - обновляем TableAdapter
        private void FormAddCountry_FormClosed(object sender, FormClosedEventArgs e)
        {
            this.gSDBCountriesTableAdapter.Fill(this.countries.GSDBCountries);
        }
    }
Вторую форму вызываю из первой через button:
C#
1
2
3
4
5
6
7
8
9
10
private void toolStripButton1_Click(object sender, EventArgs e)
        {
            DialogResult dr = new DialogResult();
            FormAddCountry frmaddcoutnry = new FormAddCountry();
            dr = frmaddcoutnry.ShowDialog();
            if (dr == DialogResult.OK)
            {
                this.gSDBCountriesTableAdapter.Fill(this.countries.GSDBCountries);
            }
        }
По DoubleClick хочу редактировать данные, причем значения строк dataGridView отображать во второй форме. Этакая форма редактирования, если, допустим, введенные раннее данные не актуальны/требуют обновления.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
//Редактируем запись по дабл-клику, вызываем форму редактирования
        private void dataGridView1_DoubleClick(object sender, EventArgs e)
        {
            con = new SqlConnection(@"Data Source=localhost\SQLEXPRESS;Initial Catalog=GuardianSoftDB;Integrated Security=True");
            cmd = new SqlCommand("UPDATE [dbo].[GSDBCountries] SET [sName] = <sName, varchar(255),>WHERE <ID = @id>");
            SqlParameter param = new SqlParameter();
            param.SqlDbType = SqlDbType.Int;
            cmd.Parameters.Add(param);
            param.ParameterName = "@ID";
            FormAddCountry frmaddcoutnry = new FormAddCountry();
            frmaddcoutnry.textBox1.Text = dataGridView1.CurrentCell.Value.ToString();
            frmaddcoutnry.ShowDialog();
        }
При нажатии на сохранить (ButtonSave_Click_1 из второй формы) имею новую запись в таблицу. А хочу редактировать ту строку, по которой дабл-кликнул.
Понимаю, что, дабл-кликнув на строку, вызываю форму ДОБАВЛЕНИЯ записи с
C#
1
frmaddcoutnry.textBox1.Text = dataGridView1.CurrentCell.Value.ToString();
внутри. Понимаю, что нужно брать id строки. Как это сделать?
Как мне редактировать строки?
Редактирование dataGridView в новой форме при DoubleClick
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.09.2017, 16:46
Ответы с готовыми решениями:

Редактирование строки DataGridView в отдельной форме
подскажите, как сделать редактирование при выделении нужной строки в DataGridView и нажатию после...

Подставить данные из combobox в DatagridView при создании новой записи в этом DatagridView
Здравствуйте! Возможно я плохо искал, но я искал ответ или наводку на решение. Подскажите...

DoubleClick в DataGridView
Столкнулся с проблемой. Требуется открывать окно по двойному щелчку по одной из строк DataGridView....

DataGridView и DoubleClick
Есть две формы. в первой есть datagridview и treeview, а во второй datagridview. При выборе в...

4
3449 / 2462 / 694
Регистрация: 02.08.2011
Сообщений: 6,667
20.09.2017, 17:28 2
Цитата Сообщение от GuardianCoder Посмотреть сообщение
При нажатии на сохранить (ButtonSave_Click_1 из второй формы) имею новую запись в таблицу. А хочу редактировать ту строку, по которой дабл-кликнул.
Дело в том, что у вас в обработчике события ButtonSave_Click_1 формы добавления происходит вставка данных в бд, и хотите вы этого или нет, у вас всегда будет новая запись.
Предлагаю вот что:
1. Создать объект Country. У которого будет Id и Text свойства.
2. Переименовать форму добавления, скажем, в CountryEditForm и передавать объект типа Country в эту форму.
То есть вот так:
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
public partial class FormEditCountry : Form
    {
        public FormAddCountry(Country entity)
        {
            if (entity == null)
                  throw new ArgumentNullException(nameof(entity));
            Country = entity;
            InitializeComponent();
        }
 
    
        public Country Country {get;set;}
        
 
        //Нажали "Сохранить"
        private void ButtonSave_Click_1(object sender, EventArgs e)
        {
            // тут никаких манипуляций с бд не нужно делать
            // можно просто провалидировать на наличие уже существующих строк
            // можете создать для этого класс CountryValidator, например
            // типа if (!validator.IsValid(Country))
            //              {  showmessage and return while no closing form}
            Close();
        }
 
        //Нажали "Отмена"
        private void ButtonCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }
 
        //Загружена форма - обновляем TableAdapter
        private void FormAddCountry_Load(object sender, EventArgs e)
        {
            this.gSDBCountriesTableAdapter.Fill(this.countries.GSDBCountries);
        }
 
        //Закрывается форма - обновляем TableAdapter
        private void FormAddCountry_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.gSDBCountriesTableAdapter.Fill(this.countries.GSDBCountries);
        }
 
        //Закрыта форма - обновляем TableAdapter
        private void FormAddCountry_FormClosed(object sender, FormClosedEventArgs e)
        {
            this.gSDBCountriesTableAdapter.Fill(this.countries.GSDBCountries);
        }
    }
3. Далее создать класс репозитория, куда вы вынесете всю логику работу с данными, например:
C#
1
2
3
4
5
6
7
8
// простейший случай
interface ICountryRepository
{
     void AddCountry(Country country);
     void UpdateCountry(Country newValue);
}
// далее пишите реализацию
// типа DefaultCountryRepository
4. И код основной формы у вас превращается вот в такой вот:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ICountryRepository defaultRepository = new DefaultCountryRepository();
//Редактируем запись по дабл-клику, вызываем форму редактирования
        private void dataGridView1_DoubleClick(object sender, EventArgs e)
        { 
               //примерно так
               // получить текущую сущность
              var rowIndex = // получить индекс текущей строки в гриде
              var selectedEntity = ((List<Country>)dataGridView1.DataSource)[index];              
              var editForm = new EditForm(selectedEntity);
              if (editForm.ShowDialog() != DialogResult.OK) 
                            return;
              defaultRepository.UpdateCountry(selectedEntity);
               // do notification whether it's ok or not
        }
5. Соответственно для вставки новой строки код будет очень похожим:
C#
1
2
3
4
5
6
7
8
9
  var newCountry = new Country();
  var editForm = new EditForm(newCountry);
 if (editForm.ShowDialog() != DialogResult.OK) 
                        return;
// обновляем модель
 defaultRepository.AddCountry(newCountry);
 // обновляем UI
   dataGridView.Rows.Add(blablabla)
 // do notification whether it's ok or not
Добавлено через 8 минут
В принципе свойство Country для EditForm нам даже не потребуется, если после нажатия Save в диалоге мы будем вручную обновлять значения объекта Country. Но по-хорошему оно нужно, так как обычно делается привязка контролов к свойствам модели представления.
1
2 / 2 / 2
Регистрация: 02.06.2017
Сообщений: 63
20.09.2017, 17:32  [ТС] 3
Хм... Неужели нет варианта проще...? Помнится, давно, на С++ еще правда, просто передавал параметры в форму. Вероятно, на шарпе вполне реализовать подобное....
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
92
93
94
95
96
97
98
99
100
//---------------------------------------------------------------------------
void __fastcall TFOrganizations::ActionEditExecute(TObject *Sender)
{
 if (dmData->QueryOrg->Eof) return;
  FOrganizationsEdit->ID = dmData->QueryOrg->FieldByName("ID")->AsInteger;
  FOrganizationsEdit->ShowModal();
  ID = FOrganizationsEdit->ID;
  SQLOrg();
}
//---------------------------------------------------------------------------
void __fastcall TFOrganizations::DBGOrganizationsTitleClick(TColumn *Column)
{
 for (int i = 0; i < DBGOrganizations->Columns->Count; i++)
  DBGOrganizations->Columns->Items[i]->Title->Font->Color = clWindowText;
  Column->Title->Font->Color = clBlue;
  IndexT  = Column->FieldName;
  try{
    ID = dmData->QueryOrg->FieldByName("ID")->AsInteger;}
  catch(...){}
  SQLOrg();
}
//---------------------------------------------------------------------------
void __fastcall TFOrganizations::FormCreate(TObject *Sender)
{
   Search<<loPartialKey<<loCaseInsensitive;
// Выделение цветом индексируемого столбца
  DBGOrganizations->Columns->Items[0]->Title->Font->Color = clBlue;
  IndexT = "Name";
  ID     = -1;
}
//---------------------------------------------------------------------------
void __fastcall TFOrganizations::FormActivate(TObject *Sender)
{
   SearchChange = false;   // признак поиска
  MainForm->ShowFind(true, StatusBar1);  // очистить строку поиска
  SQLOrg();
}
//---------------------------------------------------------------------------
void __fastcall TFOrganizations::FormKeyPress(TObject *Sender, char &Key)
{
 if(!DBGOrganizations->Focused()) return;
   if(Key == '\b')  // BackSpace
      SearchStr = SearchStr.SubString(1,SearchStr.Length() - 1);
   else
      SearchStr += Key;
   SearchData();  // найти запись
   if(Key == '\x1B')  // Esc
      SearchStr = "";
   Key = 0;
   MainForm->ShowFind(false, StatusBar1);  // очистить строку поиска
}
//---------------------------------------------------------------------------
// найти запись
void __fastcall TFOrganizations::SearchData()
{
  AnsiString LocatedField = DBGOrganizations->SelectedField->FieldName.UpperCase(); // поле поиска
  try
  { SearchChange = true;
    dmData->QueryOrg->Locate(LocatedField, SearchStr, Search);
    SearchChange = false;
  }
  catch(...)
  {}
}
//---------------------------------------------------------------------------
void __fastcall TFOrganizations::SQLOrg()
{
  dmData->QueryOrg->DisableControls();
  dmData->QueryOrg->Close();
  dmData->QueryOrg->SQL->Clear();
  dmData->QueryOrg->SQL->Add("select * from tb_organizations order by " + IndexT);
  dmData->QueryOrg->Open();
  if (ID != -1)
    try{
        dmData->QueryOrg->Locate("ID", ID, Search);}
    catch(...){}
  dmData->QueryOrg->EnableControls();
}
//---------------------------------------------------------------------------
void __fastcall TFOrganizations::ActionAddExecute(TObject *Sender)
{
  FOrganizationsEdit->ID = -1;
  FOrganizationsEdit->ShowModal();
  ID = FOrganizationsEdit->ID;
  SQLOrg();
}
//---------------------------------------------------------------------------
void __fastcall TFOrganizations::ActionCloseExecute(TObject *Sender)
{
  if (Application->MessageBox("Вы действительно хотите закрыть Справочник -> Организации?",
  "Программа сообщает:", MB_YESNO + MB_ICONQUESTION) == IDYES)
    Close();
}
//---------------------------------------------------------------------------
void __fastcall TFOrganizations::ActionDelExecute(TObject *Sender)
{
  ID = dmData->Delete(dmData->QueryOrg, "tb_organizations", "ID");
  SQLOrg();
}
//---------------------------------------------------------------------------
0
3449 / 2462 / 694
Регистрация: 02.08.2011
Сообщений: 6,667
20.09.2017, 17:45 4
Лучший ответ Сообщение было отмечено GuardianCoder как решение

Решение

Цитата Сообщение от GuardianCoder Посмотреть сообщение
просто передавал параметры в форму
Я так и делаю:
C#
1
2
3
4
5
6
7
public FormAddCountry(Country entity) // <-- вот это вот параметр в форму 
        {
            if (entity == null)
                  throw new ArgumentNullException(nameof(entity));
            Country = entity;
            InitializeComponent();
        }
Проблема в том, что у вас добавление записи жестко привязано к кнопке Ok формы добавления.
Я предложил вам вынести эту логику в отдельный объект (DefaultCountryRepository) и изменить немного фунционал этой формы, так как она нужна просто для редактирования объекта. Таким образом можно убить сразу двух заяцов: использовать для редактирования существующей записи и для вставки новой записи.

Добавлено через 4 минуты
В 4 пункте там UI тоже обновить соответствено после обновления модели.
1
2 / 2 / 2
Регистрация: 02.06.2017
Сообщений: 63
21.09.2017, 10:00  [ТС] 5
Буду пробовать, спасибо!
0
21.09.2017, 10:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.09.2017, 10:00
Помогаю со студенческими работами здесь

DataGridView на одной форме и TexTBox на другой. Текстбоксы должны обеспечивать редактирование выбранной в гриде строки. Как?
Имеются две формы. Первая - содержит DataGridView DataGridView имеет источник данных - это...

DoubleClick по строке DataGridView и операции с данными этой строки
сорри не знал как правильно назвать тему Хочу сделать поиск. В DataGridView у меня будут выводится...

Неправильный id в dataGridView при добавлении новой строки
Есть таблица &quot; Accounts &quot; столбик &quot; id &quot; с автоинкрементом , в dataGridView , при добавлении новой...

Как правильно обработать DoubleClick по строке в DataGridView и определить номер этой строки
И снова здравствуйте! Хочу обработать двойной щелчек по строке в DataGridView Нарыл в тырнете...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru