Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/43: Рейтинг темы: голосов - 43, средняя оценка - 4.56
8 / 12 / 2
Регистрация: 25.12.2017
Сообщений: 280

DataGridView "Строки нельзя программным способом добавить в коллекцию строк DataGridView"

22.10.2021, 14:15. Показов 9802. Ответов 72
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При попытке добавить в DGV данные из Textbox появляется ошибка "Строки нельзя программным способом добавить в коллекцию строк DataGridView, если элемент управления привязан к данным." в строке dataGridView1.Rows.Add();

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace ACS_MAR_Nigma
{
    public partial class Form2 : Form
    {
        Form1 fgrid1;
        public Form2(Form1 f1)
        {
            InitializeComponent();
            this.fgrid1 = f1;
        }
 
        //Добавить оборудование в таблицу
        private void button1_Click(object sender, EventArgs e)
        {
            fgrid1.dataGridView1.Rows.Add(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, textBox5.Text);
 
        }
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.10.2021, 14:15
Ответы с готовыми решениями:

Заполнять DGV через textBox: Строки нельзя программным способом добавить в коллекцию строк DataGridView
Доброй ночи. У меня есть база данных (встроенная которая, отоброжается она в dataGridView) и мне нужно ее заполнять с textBox-ов. ...

Вставка строк в datagridview программным способом + сортировка
Есть одна таблица (table). Есть datagridview, в которую я вывожу данные о строке, можно назвать карточкой клиента (card1). Порядок строк...

DataGridView. Нельзя программным способом добавить в коллекцию строк, если контрол привязан к данным
Нуждаюсь в помощи. Появляется ошибка "Строки нельзя программным способом добавить в коллекцию строк DataGridView, если элемент управления...

72
8 / 12 / 2
Регистрация: 25.12.2017
Сообщений: 280
26.10.2021, 06:58  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Как это нет, а это что?

C#
1
2
3
4
5
6
   // Показать таблицу Оборудование
            string SqlText = "SELECT * FROM [Equipment]";
            SqlDataAdapter da = new SqlDataAdapter(SqlText, conn);
            DataSet ds = new DataSet();
            da.Fill(ds, "[Equipment]");
            dataGridView1.DataSource = ds.Tables["[Equipment]"].DefaultView;

Это больше не мой код, мой код - в трех новых фрагментах сверху. Все переделано с нуля.

В том и незадача теперь, с реализацией поиска. И если в DGV его можно было реализовать по разному, то тут с ListView - беда. Большинство тем поиска в ListView из найденных на Киберфоруме вообще остались без решений. В Интернете тоже нормального кода не нашел, вчера с вечера до первого часу ночи искал.
0
 Аватар для Andrey-MSK
3368 / 2254 / 388
Регистрация: 14.08.2018
Сообщений: 7,631
Записей в блоге: 4
26.10.2021, 07:07
Цитата Сообщение от Jim Reinor Посмотреть сообщение
Это больше не мой код, мой код - в трех новых фрагментах сверху. Все переделано с нуля.
Хорошо, уговорили, не ваш так не ваш.
Тогда вот это что? Ведь привязка или я что-то путаю?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        public Form1()
        {
            InitializeComponent();
 
            string connectionString = ConfigurationManager.ConnectionStrings["Conn"].ConnectionString;
            string sql = "SELECT * FROM Equipment";
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                // Создаем объект DataAdapter
                SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);
                // Создаем объект Dataset
                DataSet ds = new DataSet();
                // Заполняем Dataset
                adapter.Fill(ds);
                // Отображаем данные
                dataGridView1.DataSource = ds.Tables[0]; // Вот она родимая :)
            }
 
        }
Вот и перепишите как в примере, и вертите коллекцию как вашей душе угодно, а UI пусть занимается тем, чем и должен - ОТОБРАЖЕНИЕМ данных.
0
8 / 12 / 2
Регистрация: 25.12.2017
Сообщений: 280
26.10.2021, 07:09  [ТС]
И это тоже не мое. У меня вообще нет слова DataGridView. Мое - в недавнем сообщении с тремя фрагментами и скрином решения. Там совсем все по другому, чем до того было реализовано.
0
 Аватар для Andrey-MSK
3368 / 2254 / 388
Регистрация: 14.08.2018
Сообщений: 7,631
Записей в блоге: 4
26.10.2021, 07:12
Цитата Сообщение от Jim Reinor Посмотреть сообщение
И это тоже не мое.
Всё это было вашим, не надо отнекиваться
Зачем вы читаете сразу в контрол?
C#
1
2
3
4
5
6
7
8
9
10
11
                while (await sqlReader.ReadAsync())
                {
                    ListViewItem item = new ListViewItem(new string[] {
                    Convert.ToString(sqlReader["e_Num"]),
                    Convert.ToString(sqlReader["e_serial"]),
                    Convert.ToString(sqlReader["e_name"]),
                    Convert.ToString(sqlReader["e_cond"]),
                    Convert.ToString(sqlReader["e_status"]),
                  });
 
                    listView1.Items.Add(item);
Сами поняли или подсказать?
0
8 / 12 / 2
Регистрация: 25.12.2017
Сообщений: 280
26.10.2021, 07:14  [ТС]
Сначала ("SELECT * FROM [Equipment]", sqlConnection);, а потом добавляем столбцы в listView
0
 Аватар для Andrey-MSK
3368 / 2254 / 388
Регистрация: 14.08.2018
Сообщений: 7,631
Записей в блоге: 4
26.10.2021, 07:19
Цитата Сообщение от Jim Reinor Посмотреть сообщение
а потом добавляем столбцы в listView
Если ListView в Window Forms не поддерживает чего вам надо, то зачем тогда его использовать?
Вот пример по привязке данных к ListView WF - https://www.codeproject.com/Ar... a-ListView
Если нужно гораздо более широкое применение UI - добро пожаловать в WPF, там с этим делом всё гораздо лучше. Но компоновка приложения будет другой.

Добавлено через 49 секунд
И чего это вдруг DGV вас не устроил?
0
8 / 12 / 2
Регистрация: 25.12.2017
Сообщений: 280
26.10.2021, 07:26  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Если ListView в Window Forms не поддерживает чего вам надо, то зачем тогда его использовать?
У меня не было жестких рамок, во что выводить данные, и я ставил на эффективность и работоспособность задачи.
В примере, словно назло, добавили опцию поиска, но форму дописывать не стали, а переложили на следующее видео, которое так и не было снято.
Ну тогда как вариант - переделать Form1.cs под стандартизированную DataGridView. И все - как часы.
Правда у меня с этим тоже проблемы - разрываются связи между работой с данными, но однако, что хорошо, там нет никаких привязок к данным и классам.

Можно как-то Form1.cs из статьи "перепрошить" под DataGridView более прямыми руками? Там надо грамотно поправить несколько строчек с listView альтернативными методами из DGV, и запросы из 2 других форм будут работать уже с ней, они вообще не ориентируются на источник вывода данных и не используют listView в коде.
Вчера я пытался "пересесть" обратно на DGV ради возможности поиска, и возможность пересесть такая есть, но реализация у меня опять подкачала.

Добавлено через 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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;
using ExcelObj = Microsoft.Office.Interop.Excel;
using System.Data.OleDb;
using System.Configuration;
 
 
namespace ACS_MAR_Nigma
{
    public partial class Form1 : Form
    {
        private SqlConnection sqlConnection = null;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private async void Form1_Load(object sender, EventArgs e)
        {
            string connectionString = ConfigurationManager.ConnectionStrings["Conn"].ConnectionString;
 
            sqlConnection = new SqlConnection(connectionString);
 
            await sqlConnection.OpenAsync();
            
            listView1.GridLines = true;
            listView1.FullRowSelect = true;
            listView1.View = View.Details;
            //Имена строк
            listView1.Columns.Add("Номер записи оборудования");
            listView1.Columns.Add("Серийный номер оборудования");
            listView1.Columns.Add("Наименование");
            listView1.Columns.Add("Состояние");
            listView1.Columns.Add("Статус");
 
            await LoadEquipmentsAsync();
        }
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (sqlConnection != null && sqlConnection.State != ConnectionState.Closed)
                sqlConnection.Close();
        }
 
        private async Task LoadEquipmentsAsync() //SELECT
        {
            SqlDataReader sqlReader = null;
            SqlCommand getEquipmentsCommand = new SqlCommand("SELECT * FROM [Equipment]", sqlConnection);
 
            try
            {
                sqlReader = await getEquipmentsCommand.ExecuteReaderAsync();
 
                while (await sqlReader.ReadAsync())
                {
                    ListViewItem item = new ListViewItem(new string[] {
                    Convert.ToString(sqlReader["e_Num"]),
                    Convert.ToString(sqlReader["e_serial"]),
                    Convert.ToString(sqlReader["e_name"]),
                    Convert.ToString(sqlReader["e_cond"]),
                    Convert.ToString(sqlReader["e_status"]),
                  });
 
                    listView1.Items.Add(item);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                if (sqlReader != null && !sqlReader.IsClosed)
                {
                    sqlReader.Close();
                }
            }
        }
 
 
 
        //Форма Добавить данные
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f = new Form2(sqlConnection);
            f.Show();
        }
        //Форма Найти данные
        private void button2_Click(object sender, EventArgs e)
        {
            Form5 f = new Form5(this);
            f.Show();
        }
        //Форма Изменить данные
        private void button3_Click(object sender, EventArgs e)
        {
            if (listView1.SelectedItems.Count > 0)
            {
                Form3 f = new Form3(sqlConnection, Convert.ToInt32(listView1.SelectedItems[0].SubItems[0].Text));
                f.Show();
            }
            else 
            {
                MessageBox.Show("Ни одна строка не была выделена!","Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        //Форма Удалить данные
        private async void button6_Click(object sender, EventArgs e)
        {
            if (listView1.SelectedItems.Count > 0)
            {
                DialogResult res = MessageBox.Show("Вы действительно хотите удалить выбранное оборудование из системы?", "Удаление оборудования", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation);
 
                switch (res)
                {
                    case DialogResult.OK:
 
                        SqlCommand deleteEquipmentCommand = new SqlCommand("DELETE FROM [Equipment] WHERE [e_Num]=@e_Num", sqlConnection);
 
                        deleteEquipmentCommand.Parameters.AddWithValue("e_Num", Convert.ToInt32(listView1.SelectedItems[0].SubItems[0].Text));
 
                        try
                        {
                            await deleteEquipmentCommand.ExecuteNonQueryAsync();
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                        listView1.Items.Clear();
 
                        await LoadEquipmentsAsync();
 
                        break;
                }
            }
            else
            {
                MessageBox.Show("Ни одна строка не была выделена!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        
        }
        //Кнопка Экспорт данных в Excel
        private void button4_Click(object sender, EventArgs e)
        {
 
        }
        //Кнопка Обновить таблицу
        private async void button7_Click(object sender, EventArgs e)
        {
            listView1.Items.Clear();
 
            await LoadEquipmentsAsync();
        }
 
        private void выходToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
 
        private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("NNN", "О программе", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
 
 
    }
}
0
 Аватар для Andrey-MSK
3368 / 2254 / 388
Регистрация: 14.08.2018
Сообщений: 7,631
Записей в блоге: 4
26.10.2021, 07:38
Цитата Сообщение от Jim Reinor Посмотреть сообщение
Вчера я пытался "пересесть" обратно на DGV ради возможности поиска, и возможность пересесть такая есть, но реализация у меня опять подкачала.
Читайте данные не в DataSet, а в BindingList с помощью SqlDataReader, вы уже им читали в ListView. И BindingList привязывайте к DGV в DataSource.
И уже потом ищите, фильтруйте, удаляйте, добавляйте уже в самой коллекции, DVG автоматически должен обновляться при изменении коллекции.
И еще самое наверно главное - элементы UI никогда не должны хранить в себе данные, для этого создаются специальные классы - вот почитайте тут на форуме, тема даже приклеплена - Создание программы - ООП модель, MVP
Вот так должно выглядеть правильное приложение на WF.
1
8 / 12 / 2
Регистрация: 25.12.2017
Сообщений: 280
26.10.2021, 07:51  [ТС]
Основные проблемы у меня с заменой тут.
Но если решить ее, то вся задача будет полностью решена и проблеме конец.

C#
1
2
3
4
5
6
7
8
        //Форма Изменить данные
        private void button3_Click(object sender, EventArgs e)
        {
            if (listView1.SelectedItems.Count > 0)
            {
                Form3 f = new Form3(sqlConnection, Convert.ToInt32(listView1.SelectedItems[0].SubItems[0].Text));
                f.Show();
            }
Добавлено через 12 минут
И здесь увы тоже, надо как-то правильно заменить на другой элемент, пока не выходит

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        private async Task LoadEquipmentsAsync() //SELECT
        {
            SqlDataReader sqlReader = null;
            SqlCommand getEquipmentsCommand = new SqlCommand("SELECT * FROM [Equipment]", sqlConnection);
 
            try
            {
                sqlReader = await getEquipmentsCommand.ExecuteReaderAsync();
 
                while (await sqlReader.ReadAsync())
                {
                    ListViewItem item = new ListViewItem(new string[] {
                    Convert.ToString(sqlReader["e_Num"]),
                    Convert.ToString(sqlReader["e_serial"]),
                    Convert.ToString(sqlReader["e_name"]),
                    Convert.ToString(sqlReader["e_cond"]),
                    Convert.ToString(sqlReader["e_status"]),
                  });
 
                    listView1.Items.Add(item);
                }
            }
0
 Аватар для Andrey-MSK
3368 / 2254 / 388
Регистрация: 14.08.2018
Сообщений: 7,631
Записей в блоге: 4
26.10.2021, 08:16
Лучший ответ Сообщение было отмечено Jim Reinor как решение

Решение

Цитата Сообщение от Jim Reinor Посмотреть сообщение
И здесь увы тоже, надо как-то правильно заменить на другой элемент, пока не выходит
Я вам уже кучу способов показал как это всё делается. Примеры видели мои? Разобрались в принципе их работы?
Цитата Сообщение от Jim Reinor Посмотреть сообщение
C#
1
listView1.Items
Это простая коллекция, к ней подходят все те моменты, которые я описал в примерах.
ListView.Items Property
ListView.ListViewItemCollection Class
1
8 / 12 / 2
Регистрация: 25.12.2017
Сообщений: 280
26.10.2021, 09:17  [ТС]
Только сейчас увидел Ваше сообщение. Пока смотрел еще один видеоурок, и поиск по ListView у меня получается, но пока только по первому элементу - по Idшнику. Но если там был бы текст, он бы искал и по нему. Пробую дальше.

Добавлено через 29 минут
Да, в ListView можно сделать поиск через лямбда-выражения по нескольким элементам со сравнением условий, это работает. Осталось только подшаманить в более-менее приличный вид и выложить сюда.
0
8 / 12 / 2
Регистрация: 25.12.2017
Сообщений: 280
26.10.2021, 09:52  [ТС]
Вопрос считается решенным, и задача решена.

Andrey-MSK и wizard41 - спасибо за оказанную помощь, а также за предоставление различных возможностей реализации кода.

Задача в данном примере осуществляется для одной таблицы, но ничто не мешает прописать и несколько.

Пример приложения на C# Windows Forms, взаимодействующий с БД MS SQL Server.
Вставка/обновление/удаление/поиск по нескольким критериям, но критериев может быть и больше двух, и для каждого столбца с любым типом данных, по своему желанию.

Передача переменных типа DATE ,button в button_click через обновление:
C#
1
updateEquipmentCommand.Parameters.AddWithValue("e_status", Convert.ToDateTime(textBox3.Text));
App.config (у остальных будут собственные настройки подключения свои)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
      <add name="Conn"
     connectionString="Data Source=HP-BORISOV;Initial Catalog=Mar;Integrated Security=True;"
     providerName="System.Data.SqlClient"/>
    <add name="ExcelXLSConnect"
         connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;'"/>
    <add name="ExcelXLSXConnect"
         connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0 Xml;HDR=Yes;'"/>
    </connectionStrings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>
Основная форма (и функция поиска и удаления записей):
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;
using ExcelObj = Microsoft.Office.Interop.Excel;
using System.Data.OleDb;
using System.Configuration;
 
 
namespace ACS_MAR_Nigma
{
    public partial class Form1 : Form
    {
        private SqlConnection sqlConnection = null;
 
        private List<string[]> rows = null;
        private List<string[]> filteredList = null;
        
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private async void Form1_Load(object sender, EventArgs e)
        {
            string connectionString = ConfigurationManager.ConnectionStrings["Conn"].ConnectionString;
 
            sqlConnection = new SqlConnection(connectionString);
 
            await sqlConnection.OpenAsync();
            
            listView1.GridLines = true;
            listView1.FullRowSelect = true;
            listView1.View = View.Details;
            //Имена строк
            listView1.Columns.Add("Номер записи оборудования");
            listView1.Columns.Add("Серийный номер оборудования");
            listView1.Columns.Add("Наименование");
            listView1.Columns.Add("Состояние");
            listView1.Columns.Add("Статус");
 
            await LoadEquipmentsAsync();
        }
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (sqlConnection != null && sqlConnection.State != ConnectionState.Closed)
                sqlConnection.Close();
        }
 
        private async Task LoadEquipmentsAsync() //SELECT
        {
            SqlDataReader sqlReader = null;
            SqlCommand getEquipmentsCommand = new SqlCommand("SELECT * FROM [Equipment]", sqlConnection);
 
            rows = new List<string[]>();
 
            string[] row = null;
            try
            {
                sqlReader = await getEquipmentsCommand.ExecuteReaderAsync();
 
                while (await sqlReader.ReadAsync())
                {
                    row = new string[] {
                    Convert.ToString(sqlReader["e_Num"]),
                    Convert.ToString(sqlReader["e_serial"]),
                    Convert.ToString(sqlReader["e_name"]),
                    Convert.ToString(sqlReader["e_cond"]),
                    Convert.ToString(sqlReader["e_status"])
                    };
 
                    rows.Add(row);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                if (sqlReader != null && !sqlReader.IsClosed)
                {
                    sqlReader.Close();
                }
            }
            RefreshList(rows);
        }
 
 
 
        private void RefreshList(List<string[]> list)
        {
            listView1.Items.Clear();
            foreach (string[] s in list)
            {
                listView1.Items.Add(new ListViewItem(s));
            }
        }
 
 
        //Форма Добавить данные
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f = new Form2(sqlConnection);
            f.Show();
        }
        //Форма Найти данные
        private void button2_Click(object sender, EventArgs e)
        {
            Form5 f = new Form5(this);
            f.Show();
        }
        //Форма Изменить данные
        private void button3_Click(object sender, EventArgs e)
        {
            if (listView1.SelectedItems.Count > 0)
            {
                Form3 f = new Form3(sqlConnection, Convert.ToInt32(listView1.SelectedItems[0].SubItems[0].Text));
                f.Show();
            }
            else 
            {
                MessageBox.Show("Ни одна строка не была выделена!","Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        //Форма Удалить данные
        private async void button6_Click(object sender, EventArgs e)
        {
            if (listView1.SelectedItems.Count > 0)
            {
                DialogResult res = MessageBox.Show("Вы действительно хотите удалить выбранное оборудование из системы?", "Удаление оборудования", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation);
 
                switch (res)
                {
                    case DialogResult.OK:
 
                        SqlCommand deleteEquipmentCommand = new SqlCommand("DELETE FROM [Equipment] WHERE [e_Num]=@e_Num", sqlConnection);
 
                        deleteEquipmentCommand.Parameters.AddWithValue("e_Num", Convert.ToInt32(listView1.SelectedItems[0].SubItems[0].Text));
 
                        try
                        {
                            await deleteEquipmentCommand.ExecuteNonQueryAsync();
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                        listView1.Items.Clear();
 
                        await LoadEquipmentsAsync();
 
                        break;
                }
            }
            else
            {
                MessageBox.Show("Ни одна строка не была выделена!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        
        }
        //Кнопка Экспорт данных в Excel
        private void button4_Click(object sender, EventArgs e)
        {
 
        }
        //Кнопка Обновить таблицу
        private async void button7_Click(object sender, EventArgs e)
        {
            listView1.Items.Clear();
 
            await LoadEquipmentsAsync();
        }
 
        private void выходToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
 
        private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("NNN\nNNN", "О программе", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
 
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            filteredList = rows.Where((x) => 
            x[2].ToLower().Contains(textBox1.Text.ToLower())).ToList();
 
            RefreshList(filteredList);
        }
 
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            switch (comboBox1.SelectedIndex)
            {
                case 0:
 
                    filteredList = rows.Where((x) => 
                     Double.Parse(x[1]) <= 10000).ToList();
                    RefreshList(filteredList);
                    break;
 
                case 1:
                    filteredList = rows.Where((x) =>
                   Double.Parse(x[1]) > 10000 && Double.Parse(x[1]) <= 55555).ToList();
                    RefreshList(filteredList);
                    break;
 
                case 2:
                    filteredList = rows.Where((x) =>
                   Double.Parse(x[1]) > 99999).ToList();
                    RefreshList(filteredList);
                    break;
 
                case 3:
                    RefreshList(rows);
                    break;
            }
        }
 
 
    }
}
Вставка данных
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
 
namespace ACS_MAR_Nigma
{
    public partial class Form2 : Form
    {
        private SqlConnection sqlConnection = null;
 
        public Form2(SqlConnection connection)
        {
            InitializeComponent();
 
            sqlConnection = connection;
 
        }
 
        //Добавить оборудование в таблицу
        private async void button1_Click(object sender, EventArgs e)
        {
            SqlCommand insertEquipmentCommand = new SqlCommand("INSERT INTO [Equipment] (e_Num, e_serial, e_name, e_cond, e_status) VALUES(@e_Num, @e_serial, @e_name, @e_cond, @e_status)", sqlConnection);
 
            insertEquipmentCommand.Parameters.AddWithValue("e_Num", textBox1.Text);
            insertEquipmentCommand.Parameters.AddWithValue("e_serial", textBox2.Text);
            insertEquipmentCommand.Parameters.AddWithValue("e_name", textBox3.Text);
            insertEquipmentCommand.Parameters.AddWithValue("e_cond", textBox5.Text);
            insertEquipmentCommand.Parameters.AddWithValue("e_status", textBox4.Text);
 
            try 
            {
                await insertEquipmentCommand.ExecuteNonQueryAsync();
 
                Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
       
        //Отмена
        private void button2_Click(object sender, EventArgs e)
        {
            Close();
        }
    }
}
Обновление данных
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;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
 
namespace ACS_MAR_Nigma
{
    public partial class Form3 : Form
    {
        private SqlConnection sqlConnection = null;
 
        private int id;
 
        public Form3(SqlConnection connection,int id)
        {
            InitializeComponent();
 
            sqlConnection = connection;
 
            this.id = id;
        }
 
        private async void Form3_Load(object sender, EventArgs e)
        {
            SqlCommand getEquipmentInfoCommand = new SqlCommand("SELECT [e_serial], [e_name], [e_cond], [e_status] FROM [Equipment] WHERE [e_Num]=@e_Num", sqlConnection);
 
            getEquipmentInfoCommand.Parameters.AddWithValue("e_Num", id);
 
            SqlDataReader sqlReader = null;
 
            try
            {
                sqlReader = await getEquipmentInfoCommand.ExecuteReaderAsync();
 
                while (await sqlReader.ReadAsync())
                {
 
                    textBox2.Text = Convert.ToString(sqlReader["e_serial"]);
                    textBox3.Text = Convert.ToString(sqlReader["e_name"]);
                    textBox5.Text = Convert.ToString(sqlReader["e_cond"]);
                    textBox4.Text = Convert.ToString(sqlReader["e_status"]);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                if (sqlReader != null && !sqlReader.IsClosed)
                {
                    sqlReader.Close();
                }
            }
        }
 
        //Обновить оборудование в таблице
        private async void button1_Click(object sender, EventArgs e)
        {
            SqlCommand updateEquipmentCommand = new SqlCommand("UPDATE [Equipment] SET [e_serial]=@e_serial, [e_name]=@e_name, [e_cond]=@e_cond, [e_status]=@e_status WHERE [e_Num]=@e_Num", sqlConnection);
 
            updateEquipmentCommand.Parameters.AddWithValue("e_Num", id);
            updateEquipmentCommand.Parameters.AddWithValue("e_serial", textBox2.Text);
            updateEquipmentCommand.Parameters.AddWithValue("e_name", textBox3.Text);
            updateEquipmentCommand.Parameters.AddWithValue("e_cond", textBox5.Text);
            updateEquipmentCommand.Parameters.AddWithValue("e_status", textBox4.Text);
 
            try
            {
                await updateEquipmentCommand.ExecuteNonQueryAsync();
                Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        //Отмена
        private void button2_Click(object sender, EventArgs e)
        {
            Close();
        }
 
    }
}
Скрипт SQL на создание таблицы БД, используемой в примере
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
/* Создание таблицы Оборудование */
USE Mar;
GO
IF EXISTS (SELECT * FROM sys.tables  WHERE NAME = 'Equipment')
DROP TABLE Equipment;
CREATE TABLE Equipment
    (e_Num INT NOT NULL, --Номер записи оборудования
     e_serial INT NOT NULL,--Серийный номер оборудования
     e_name VARCHAR(150) NOT NULL, --Наименование оборудования
     e_cond VARCHAR(50) NOT NULL, --Состояние
     e_status VARCHAR(40) NOT NULL, --Статус
     CONSTRAINT FK_Equipment PRIMARY KEY (e_Num) );
GO
Пример универсален, и может расширяться.

Andrey-MSK и wizard41 - еще раз благодарность за оказанную помощь.
Миниатюры
DataGridView "Строки нельзя программным способом добавить в коллекцию строк DataGridView"   DataGridView "Строки нельзя программным способом добавить в коллекцию строк DataGridView"  
0
 Аватар для Andrey-MSK
3368 / 2254 / 388
Регистрация: 14.08.2018
Сообщений: 7,631
Записей в блоге: 4
26.10.2021, 11:13
Jim Reinor, всё это конечно хорошо Но зачем при обновлении и удалении лишний раз перечитывать данные из БД? Можно ведь было просто обновить или удалить данные из коллекции
C#
1
2
3
listView.Items.Remove(dataToDelete);
listView.Items.RemoveAt(index);
listview.Items[index] = dataToUpdate;
Я же показывал как А представьте что у вас запрос выполняется секунд 5, каждый раз ждать будете?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.10.2021, 11:13
Помогаю со студенческими работами здесь

Строки нельзя добавить в коллекцию строк DataGridView, если элемент управления привязан к данным
Здравствуйте, столкнулся с такой проблемой, привязал datagridview к базе данных access. Теперь нужно заполнять таблицу введенными с...

"Строки нельзя добавить в коллекцию строк DataGridView, если элемент управления привязан к данным"
Привязал базу access к DataGridView1, таблицу открыло, всё нормально. Мне надо чтобы по нажатию кнопки в таблице создавалась новая строка и...

Добавить строки DataGridView в коллекцию
мне надо получить строки из конкретного столбца в коллекцию, я делаю вот так, а что дальше? dgv.Columns. там не отображается ни одного...

Добавить элемент в коллекцию привязанную к DataGridView
Открываю форму с таблицей DataGridView, если в коллекции есть данные то они отобразятся в таблице и будут обновляться, но если данных нет,...

Ошибка "Исключение в DataGridView" при попытке добавить таблицу в DataGridView. Значения по умолчанию новой строки
Вероятностно у меня где-то ошибка в присвоении заголовкам таблицы типов данных. using System; using System.Collections.Generic; ...


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

Или воспользуйтесь поиском по форуму:
73
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru