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

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

22.10.2021, 14:15. Показов 9879. Ответов 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
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3459 / 2780 / 575
Регистрация: 04.09.2018
Сообщений: 8,740
Записей в блоге: 3
23.10.2021, 22:50
Студворк — интернет-сервис помощи студентам
С локальными БД вечно какие-то проблемы:

Не обновляется ни хрена, висит.
Теперь создавать только новую БД с новыми таблицами.
А я уже сделал окно добавления записей и проработал код:
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3459 / 2780 / 575
Регистрация: 04.09.2018
Сообщений: 8,740
Записей в блоге: 3
24.10.2021, 21:45
Jim Reinor, с БД на домашнем компьютере не получается. Завтра на работе попробую что-нибудь сочинить для имитации.
0
8 / 12 / 2
Регистрация: 25.12.2017
Сообщений: 280
25.10.2021, 09:31  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
с БД на домашнем компьютере не получается. Завтра на работе попробую что-нибудь сочинить для имитации.
Ничего страшного. Что ж, разное бывает. Я подожду.

Добавлено через 4 часа 34 минуты
Я по прежнему не теряю надежду на решение.
0
 Аватар для Andrey-MSK
3376 / 2262 / 388
Регистрация: 14.08.2018
Сообщений: 7,670
Записей в блоге: 4
25.10.2021, 09:47
Цитата Сообщение от Jim Reinor Посмотреть сообщение
При попытке добавить в DGV данные из Textbox появляется ошибка "Строки нельзя программным способом добавить в коллекцию строк DataGridView, если элемент управления привязан к данным." в строке dataGridView1.Rows.Add();
У вас DataGridView привязан к данным из БД, вот и обновляйте данные в БД, потом обновите коллекцию к которой привязан DGV и всё у вас обновится.
Чтоб не делать лишних запросов к БД, обновите данные в БД, с помощью UPDATE, потом, если не было ошибок обновления БД, эти же данные добавьте к коллекции, к которой привязан DGV.
C#
1
listDGV.Add(newData); // или какой там у вас тип коллекции...
Добавлено через 2 минуты
только не забудьте, перед добавлением в коллекцию, в запросе на INSERT получить ID новой записи
T-SQL
1
2
INSERT ...
@newID = SCOPE_IDENTITY()
SCOPE_IDENTITY (Transact-SQL)

Добавлено через 2 минуты
если делаете UPDATE - менять значения в коллекции по индексу в коллекции, если INSERT - listDGV.Add(newData), если DELETE - listDGV.Remove(dataToDelete) или по индексу.

Добавлено через 2 минуты
List<T>.IndexOf Метод
0
8 / 12 / 2
Регистрация: 25.12.2017
Сообщений: 280
25.10.2021, 10:16  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Чтоб не делать лишних запросов к БД, обновите данные в БД, с помощью UPDATE, потом, если не было ошибок обновления БД, эти же данные добавьте к коллекции, к которой привязан DGV.
Пока не нужно, у меня вообще все неверно, и нет смысла исправлять серьезные логические ошибки, то что я написал, реализация неправильна в корне, и я бы хотел посмотреть типовой маленький пример с формами, демонстрирующий правильную обработку данных. В любом случае программу придется переписать заново, но с правильными процессами обработки данных.
0
 Аватар для Andrey-MSK
3376 / 2262 / 388
Регистрация: 14.08.2018
Сообщений: 7,670
Записей в блоге: 4
25.10.2021, 10:19
Цитата Сообщение от Jim Reinor Посмотреть сообщение
и я бы хотел отыскать типовой маленький пример с формами, демонстрирующий правильную обработку данных
Работа с SqlDataAdapter и DataSet

Добавлено через 1 минуту
А вообще лучше работать с ADO .NET, читать ридером в коллекции, коллекции привязывать куда надо
Руководство по ADO.NET и работе с базами данных
1
8 / 12 / 2
Регистрация: 25.12.2017
Сообщений: 280
25.10.2021, 10:20  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Работа с SqlDataAdapter и DataSet
Я его уже видел, в этом примере нет работы с другой формой, а там свои нюансы, чтобы подключение было не в коде, и другая форма выполняла SQL-запросы и валидировала(сохраняла) результат в БД, связываясь с DataGridView на первой форме.
0
 Аватар для Andrey-MSK
3376 / 2262 / 388
Регистрация: 14.08.2018
Сообщений: 7,670
Записей в блоге: 4
25.10.2021, 10:27
Акогда освоите всё что выше, то тогда уже переходить к этому
Руководство по Entity Framework Core
Но это на вкус и цвет, кому нравится, кому нет... Мне больше голый ADO .NET нравится, EF использую только в простых случаях.

Добавлено через 3 минуты
Цитата Сообщение от Jim Reinor Посмотреть сообщение
чтобы подключение было не в коде
Я вам уже писал про App.conf
Цитата Сообщение от Jim Reinor Посмотреть сообщение
и другая форма выполняла SQL-запросы и валидировала(сохраняла) результат в БД, связываясь с DataGridView на первой форме.
Передавать данные через конструктор формы при её открытии, при закрытии формы или нажатии на ней кнопки, обновлять ссылочный тип, это коллекция к которой привязан DGV, и DGV сам обновится. Использовать лучше для таких целей BindingList - она сама обновляет привязанные к ней элементы интерфейса.

Добавлено через 2 минуты
Цитата Сообщение от Jim Reinor Посмотреть сообщение
Я его уже видел, в этом примере нет работы с другой формой
Есть там про другую форму, читайте внимательнее.
0
8 / 12 / 2
Регистрация: 25.12.2017
Сообщений: 280
25.10.2021, 10:27  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Я вам уже писал про App.conf
Я так и делал, но потом там выходит какая-то ерунда, когда привязываешь набор данных, и в итоге к нему не получается подключиться типовыми примерами с задачами обработки данных через формы.

Про конструктор - мне уже писали, я применял, но ошибка никуда не девается. То ли это мой невысокий уровень, то ли что-то еще.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3459 / 2780 / 575
Регистрация: 04.09.2018
Сообщений: 8,740
Записей в блоге: 3
25.10.2021, 13:10
Лучший ответ Сообщение было отмечено Jim Reinor как решение

Решение

Jim Reinor,
Накидал примерчик. В качестве БД обычный txt-файл.
Сначала файл такой:

Запускаем прогу, читаем из "БД"

Добавим запись:

Смотрим файл:

Грид в форме1 обновлен:

Я пока сделал только форму "Вставить". Остальные кнопки наверное сможете сделать по аналогии.
Что вам нужно от сюда взять:
1. Класс модели для грида, основанный на BindingList. Сам метод обновления BindingList и грида.
2. Способ передачи данных между окнами ( здесь пока со второго окна в первое ). Я использовал способ Родителя-Дочернего и публичных методах в форме 1.
Если будет время, доделаю остальные две кнопки и формы.
Ну и на счет работы с самой БД - делайте именно так, как вам посоветовал Andrey-MSK в этом посте. Это правильный подход.
В моем примере обновление грида происходит после повторной вычитки измененного файла "БД".
Вложения
Тип файла: rar WindowsFormsApp1.rar (43.8 Кб, 9 просмотров)
1
8 / 12 / 2
Регистрация: 25.12.2017
Сообщений: 280
25.10.2021, 16:20  [ТС]
Интересно, сейчас начну пробовать применить на практике.

Добавлено через 30 минут
Эх, фреймворк не встает, и он не понимает знак => из лямбда выражений, и без него тоже ошибкой считает. И отказывается понимать PropertyChanged?.Invoke и CallerMemberName

Добавлено через 38 секунд
Попробую пока другие возможности, которые тут приводил Andrey-MSK

Что означает строка dataGridView1.DataSource = ds.Tables[0]; из примера? Почему в примере таблица выбирается, а у меня выбивает NullReferenceException?

И по старому так тоже не работает: dataGridView1.DataSource = ds.Tables["[Equipment]"].DefaultView;

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
и я бы хотел отыскать типовой маленький пример с формами, демонстрирующий правильную обработку данных
Работа с SqlDataAdapter и DataSet
https://metanit.com/sharp/adonet/3.1.php

Все, починил

Добавлено через 4 минуты
С подключением через App.Config и одновременно правильную реализацию DataTable разобрался, спасибо Andrey-MSK. Надо действовать дальше, и переходить к обработке данных.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    public partial class Form1 : Form
    {
        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];
            }
 
        }
Добавлено через 8 минут
Только смущает эта строка: dataGridView1.DataSource = ds.Tables[0];

Как отобразить другие таблицы в других DGV? dataGridView2.DataSource = ds.Tables[1]; - не работает, как и старый вариант теперь для первой таблицы dataGridView1.DataSource = ds.Tables["[Equipment]"].DefaultView;
Где просмотреть индекс таблицы для того, чтобы поместить ее в DataSet?

Добавлено через 24 минуты
Нашел еще один интересный способ реализации, пока разбираюсь в нем. Если найду решение своей темы - то выложу код.

Добавлено через 48 минут
Ну что же, добавление через SQL-запрос у меня получилось, только как сделать обновление DGV после закрытия формы добавления?
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3459 / 2780 / 575
Регистрация: 04.09.2018
Сообщений: 8,740
Записей в блоге: 3
25.10.2021, 19:03
Цитата Сообщение от Jim Reinor Посмотреть сообщение
Только смущает эта строка:
И чем она смущает?
Цитата Сообщение от Jim Reinor Посмотреть сообщение
Как отобразить другие таблицы в других DGV?
В других это каких? Насколько я понял из картинки, у вас один DGV и в нем должны отображаться выбранные из БД данные.
Данные выбираются из БД согласно запросам, их кол-во и состав разный, но привязка грида к ds.Tables[0] решает эту проблему.
Цитата Сообщение от Jim Reinor Посмотреть сообщение
Нашел еще один интересный способ реализации
Да вы их можете найти хоть сто штук, проблема остается та же: вы ничего не доводите до конца. И не разбираетесь в возникших проблемах.
Цитата Сообщение от Jim Reinor Посмотреть сообщение
как сделать обновление DGV после закрытия формы добавления
При закрытии дочернего окна данные из него должны попасть в источник для обновления БД, сама БД вставить новые записи, запросом опять производится чтение из БД, заливается ваш адаптер и DGV обновляется с новыми данными.
0
8 / 12 / 2
Регистрация: 25.12.2017
Сообщений: 280
25.10.2021, 20:06  [ТС]
Я уже все сделал. Кроме поиска. Сейчас отлажу поиск и выложу.

Добавлено через 1 час 0 минут
Сейчас уже час парюсь с поиском строки в ListView, стандартный метод поиска от DGV к нему не подходит.
0
8 / 12 / 2
Регистрация: 25.12.2017
Сообщений: 280
25.10.2021, 21:17  [ТС]
В общем все работает. В данном примере - для одной таблицы, но ничто не мешает прописать и несколько. Вставка/обновление/удаление. Кроме злосчастного поиска в ListView - весь вечер его искал, проще застрелиться чем написать, в отличие от DGV реализуется он через не пойми как, это какой-то кошмар. На Киберфоруме в фильтре, ни в Интернете, ни в роликах нормального кода поиска в ListView я тоже не нашел.

Основные недостатки программы - отсутствие поиска, и возможности автоматически обновлять данные после закрытия формы - обновлять придется всегда в ручную по кнопке со стрелками.

Основная форма (и функция удаления записей):

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);
        }
 
 
    }
}
Вставка данных
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();
        }
 
    }
}
Рад был бы, если кто-нибудь из суперпрофи по C# Windows Forms смог подсказать, как сделать поиск в ListView (новичку сделать совсем нереально, это слово ад, методы взаимодействия с ним плохо формализованы и примеров дефицит), и прикрепление автоматического обновления данных после закрытия форм взаимодействия с программой, пример был бы полностью законченным.
Миниатюры
DataGridView "Строки нельзя программным способом добавить в коллекцию строк DataGridView"  
0
8 / 12 / 2
Регистрация: 25.12.2017
Сообщений: 280
25.10.2021, 21:49  [ТС]
Поиск по ListView сгодится любой, как напрямую через textBox, так и через форму2. Предпочтительнее через форму2, если это реально, но можно и на той же форме через textbox.
0
 Аватар для Andrey-MSK
3376 / 2262 / 388
Регистрация: 14.08.2018
Сообщений: 7,670
Записей в блоге: 4
26.10.2021, 05:39
Jim Reinor, Открывайте и закрывайте соединение в каждом методе с доступом к БД отдельно. Так будет более верно.
C#
1
2
3
4
5
6
7
8
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.OpenAsync();
                
                // Работа с данными
                // ...
 
            } // при выходе из этого блока соединение закроется
DataSet, DataTable лучше не использовать, это уже не поддерживаемый тип доступа к данным. Лучше работать с голым ADO .NET (SqlDataReader, SqlCommand, SqlConnection) и коллекциями.
Полный набор для работы с БД (SELECT, INSERT, UPDATE, DELETE)
C#
1
2
3
4
5
6
7
8
9
using System.Configuration;
 
namespace MDBDAL.DataAccess
{
    public class BaseDA
    {
        protected static readonly string _connectionString = ConfigurationManager.ConnectionStrings["SQLConnect"].ConnectionString;
    }
}
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
using System;
using System.Collections.ObjectModel;
using System.Data;
using System.Data.SqlClient;
 
using MDBDAL.Model;
 
namespace MDBDAL.DataAccess
{
    public class GenPlanDA : BaseDA
    {
        public static List<GenPlan> GetAll()
        {
            List<GenPlan> genPlans = new List<GenPlan>();
            string sqlText = "SELECT ID_EObject, ID_GenPlan, KKS, GPName FROM dbo.tblGenPlan ORDER BY KKS";
 
            using (SqlConnection connection = new SqlConnection(_connectionString))
            {
                try
                {
                    connection.Open();
 
                    SqlCommand sqlCommand = new SqlCommand(sqlText, connection)
                    {
                        CommandType = CommandType.Text
                    };
 
                    using (SqlDataReader dataReader = sqlCommand.ExecuteReader())
                    {
                        while (dataReader.Read())
                        {
                            genPlans.Add(new GenPlan
                            {
                                IDEObject = (int)dataReader["ID_EObject"],
                                IDGenPlan = (int)dataReader["ID_GenPlan"],
                                KKS = dataReader["KKS"] as string ?? "",
                                GPName = dataReader["GPName"] as string ?? ""
                            });
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            return genPlans;
        }
        
        public static List<GenPlan> GetByEOID(int eoID)
        {
            List<GenPlan> genPlans = new List<GenPlan>();
            string sqlText = "SELECT ID_EObject, ID_GenPlan, KKS, GPName FROM dbo.tblGenPlan " +
                "WHERE ID_EObject = @eoID ORDER BY KKS";
 
            using (SqlConnection connection = new SqlConnection(_connectionString))
            {
                try
                {
                    connection.Open();
 
                    SqlCommand sqlCommand = new SqlCommand(sqlText, connection)
                    {
                        CommandType = CommandType.Text
                    };
                    SqlParameter param = new SqlParameter
                    {
                        ParameterName = "@eoID",
                        Value = eoID,
                        SqlDbType = SqlDbType.Int,
                        Direction = ParameterDirection.Input
                    };
                    sqlCommand.Parameters.Add(param);
 
                    using (SqlDataReader dataReader = sqlCommand.ExecuteReader())
                    {
                        while (dataReader.Read())
                        {
                            genPlans.Add(new GenPlan
                            {
                                IDEObject = (int)dataReader["ID_EObject"],
                                IDGenPlan = (int)dataReader["ID_GenPlan"],
                                KKS = dataReader["KKS"] as string ?? "",
                                GPName = dataReader["GPName"] as string ?? ""
                            });
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            return genPlans;
        }
 
        public static GenPlan GetByID(int gpID)
        {
            GenPlan genPlan = new GenPlan();
            string sqlText = "SELECT ID_EObject, ID_GenPlan, KKS, GPName FROM dbo.tblGenPlan WHERE ID_GenPlan = @gpID";
 
            using (SqlConnection connection = new SqlConnection(_connectionString))
            {
                try
                {
                    connection.Open();
 
                    SqlCommand sqlCommand = new SqlCommand(sqlText, connection)
                    {
                        CommandType = CommandType.Text
                    };
                    SqlParameter param = new SqlParameter
                    {
                        ParameterName = "@gpID",
                        Value = gpID,
                        SqlDbType = SqlDbType.Int,
                        Direction = ParameterDirection.Input
                    };
                    sqlCommand.Parameters.Add(param);
 
                    using (SqlDataReader dataReader = sqlCommand.ExecuteReader())
                    {
                        while (dataReader.Read())
                        {
                            genPlan.IDEObject = (int)dataReader["ID_EObject"];
                            genPlan.IDGenPlan = (int)dataReader["ID_GenPlan"];
                            genPlan.KKS = dataReader["KKS"] as string ?? "";
                            genPlan.GPName = dataReader["GPName"] as string ?? "";
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            return genPlan;
        }
        
        public static GenPlan InsertPosition(EObject eObject, string kks, string gpName)
        {
            GenPlan genPlan = new GenPlan();
            string sqlText = "INSERT INTO dbo.tblGenPlan (ID_EObject, KKS, GPName) " +
                "VALUES (@eoID, @kks, @gpName); SELECT @newID = SCOPE_IDENTITY();";
 
            using (SqlConnection connection = new SqlConnection(_connectionString))
            {
                try
                {
                    connection.Open();
 
                    SqlCommand sqlCommand = new SqlCommand(sqlText, connection)
                    {
                        CommandType = CommandType.Text
                    };
                    SqlParameter paramEO = new SqlParameter
                    {
                        ParameterName = "@eoID",
                        Value = eObject.IDEObject,
                        SqlDbType = SqlDbType.Int,
                        Direction = ParameterDirection.Input
                    };
                    sqlCommand.Parameters.Add(paramEO);
                    SqlParameter paramKks = new SqlParameter
                    {
                        ParameterName = "@kks",
                        Value = kks,
                        SqlDbType = SqlDbType.NVarChar,
                        Size = 50,
                        Direction = ParameterDirection.Input
                    };
                    sqlCommand.Parameters.Add(paramKks);
                    SqlParameter paramName = new SqlParameter
                    {
                        ParameterName = "@gpName",
                        Value = gpName,
                        SqlDbType = SqlDbType.NVarChar,
                        Size = 255,
                        Direction = ParameterDirection.Input
                    };
                    sqlCommand.Parameters.Add(paramName);
                    SqlParameter paramId = new SqlParameter
                    {
                        ParameterName = "@newID",
                        SqlDbType = SqlDbType.Int,
                        Direction = ParameterDirection.Output
                    };
                    sqlCommand.Parameters.Add(paramId);
 
                    sqlCommand.ExecuteNonQuery();
 
                    genPlan.IDGenPlan = (int)sqlCommand.Parameters["@newID"].Value;
                    genPlan.IDEObject = eObject.IDEObject;
                    genPlan.KKS = kks;
                    genPlan.GPName = gpName;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            return genPlan;
        }
        
        public static GenPlan UpdatePosition(GenPlan genPlan, string kks, string gpName)
        {
            string sqlText = "UPDATE dbo.tblGenPlan SET KKS = @kks, GPName = @gpName WHERE ID_GenPlan = @gpID";
 
            using (SqlConnection connection = new SqlConnection(_connectionString))
            {
                try
                {
                    connection.Open();
 
                    SqlCommand sqlCommand = new SqlCommand(sqlText, connection)
                    {
                        CommandType = CommandType.Text
                    };
                    SqlParameter paramKks = new SqlParameter
                    {
                        ParameterName = "@kks",
                        Value = kks,
                        SqlDbType = SqlDbType.NVarChar,
                        Size = 50,
                        Direction = ParameterDirection.Input
                    };
                    sqlCommand.Parameters.Add(paramKks);
                    SqlParameter paramName = new SqlParameter
                    {
                        ParameterName = "@gpName",
                        Value = gpName,
                        SqlDbType = SqlDbType.NVarChar,
                        Size = 255,
                        Direction = ParameterDirection.Input
                    };
                    sqlCommand.Parameters.Add(paramName);
                    SqlParameter paramId = new SqlParameter
                    {
                        ParameterName = "@gpID",
                        Value = genPlan.IDGenPlan,
                        SqlDbType = SqlDbType.Int,
                        Direction = ParameterDirection.Input
                    };
                    sqlCommand.Parameters.Add(paramId);
 
                    sqlCommand.ExecuteNonQuery();
 
                    genPlan.GPName = gpName;
                    genPlan.KKS = kks;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            return genPlan;
        }
        
        public static void DeletePosition(GenPlan genPlan, ObservableCollection<GenPlan> genPlans)
        {
            string sqlText = "DELETE dbo.tblGenPlan WHERE ID_GenPlan = @gpID";
 
            using (SqlConnection connection = new SqlConnection(_connectionString))
            {
                try
                {
                    connection.Open();
 
                    SqlCommand sqlCommand = new SqlCommand(sqlText, connection)
                    {
                        CommandType = CommandType.Text
                    };
                    SqlParameter paramId = new SqlParameter
                    {
                        ParameterName = "@gpID",
                        Value = genPlan.IDGenPlan,
                        SqlDbType = SqlDbType.Int,
                        Direction = ParameterDirection.Input
                    };
                    sqlCommand.Parameters.Add(paramId);
 
                    sqlCommand.ExecuteNonQuery();
 
                    genPlans.Remove(genPlan);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
    }
}
Async сделаете по желанию
Позднее покажу как редактировать коллекцию.

Добавлено через 36 минут
Редактирование коллекции и запись в БД. На заголовки методов не обращайте внимания, это команды из WPF. Логика работы с коллекциями одинаковая. В комментариях написал важные моменты:
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
// Удаление (DELETE)
private async void DeleteTypeExecuted(object obj)
{
    // SelectedLaborHBType - выбранный объект в окне
    try
    {
        string qMessage = string.Format("Удалить данную запись?\n\r" +
            "{0}", SelectedLaborHBType.WorkType);
 
        if (WindowService.ShowWarningMessage(qMessage, "Удаление данных") == MessageBoxResult.Yes)
        {
            // Удаляем запись из БД
            await _laborDA.DeleteWorkTypeAsync(SelectedLaborHBType);
            
            // Удаляем объект из коллекции
            LaborHBTypes.Remove(SelectedLaborHBType);
 
            WindowService.ShowInfoMessage("Запись успешно удалена", "Удаления данных");
        }
    }
    catch (Exception ex)
    {
        WindowService.ShowErrorMessage(ex.ToString(), "Ошибка удаления");
    }
}
 
// Редактирование (INSERT, UPDATE)
private async void SaveTypeExecuted(object obj)
{
    if (PosNumberType != null & WorkTypeName != null)
    {
        try
        {
            WorkTypeName = WorkTypeName.Replace("   ", " ");
            WorkTypeName = WorkTypeName.Trim(' ', '.', ',', ';');
            
            // Создаем объект для редактирования
            LaborHBType laborHBTypeNew = new LaborHBType
            {
                // Присваиваем данные из полей окна
                IDLaborType = IDLaborHBType,
                PosNumber = (int)PosNumberType,
                WorkType = WorkTypeName
            };
            
            // Если ID больше 0 -> Делаем UPDATE
            if (IDLaborHBType > 0)
            {
                // Получаем индекс объекта в коллекции
                int index = LaborHBTypes.IndexOf(LaborHBTypes.FirstOrDefault(t => t.IDLaborType == IDLaborHBType));
 
                // Обновление данных в БД
                await _laborDA.UpdateWorkTypeAsync(laborHBTypeNew);
                
                // Обновляем объект коллекции по индексу
                LaborHBTypes[index] = laborHBTypeNew;
                
                // Ставим курсор в DataGrid (WPF) на нужный объект
                SelectedLaborHBType = LaborHBTypes.FirstOrDefault(t => t.IDLaborType == laborHBTypeNew.IDLaborType);
            }
            // Если ID =< 0 -> Делаем INSERT
            else
            {
                // Добавляем данные в БД
                await _laborDA.AddWorkTypeAsync(laborHBTypeNew);
                
                // Добавляем объект в коллекцию
                LaborHBTypes.Add(laborHBTypeNew);
                
                // Ставим курсор в DataGrid (WPF) на нужный объект
                SelectedLaborHBType = LaborHBTypes.FirstOrDefault(t => t.IDLaborType == laborHBTypeNew.IDLaborType);
            }
 
            ClearTypeFields();
        }
        catch (Exception ex)
        {
            WindowService.ShowErrorMessage(ex.ToString(), "Ошибка обновления данных");
        }
    }
    else
    {
        WindowService.ShowErrorMessage("Все поля должны быть заполнены.", "Ошибка ввода данных");
    }
}
Добавлено через 3 часа 26 минут
Цитата Сообщение от Jim Reinor Посмотреть сообщение
Сейчас уже час парюсь с поиском строки в ListView, стандартный метод поиска от DGV к нему не подходит.
Ищите в привязанной коллекции, потом делайте выделение на найденный объект коллекции.
1. Основы LINQ
2. Синтаксис LINQ

Добавлено через 8 минут
В моём примере поиск в коллекции с помощью LINQ по ID записи
C#
1
LaborHBTypes.FirstOrDefault(t => t.IDLaborType == IDLaborHBType);
0
8 / 12 / 2
Регистрация: 25.12.2017
Сообщений: 280
26.10.2021, 06:17  [ТС]
Ну для поиска совсем не обязательно подключаться к БД, можно сделать поиск по проверке "если содержит", но алгоритмы от DGV не могут обеспечить поиск по ListView.
0
 Аватар для Andrey-MSK
3376 / 2262 / 388
Регистрация: 14.08.2018
Сообщений: 7,670
Записей в блоге: 4
26.10.2021, 06:23
Цитата Сообщение от Jim Reinor Посмотреть сообщение
Ну для поиска совсем не обязательно подключаться к БД
Я вам не про БД, а про коллекцию, которую получили для заполнения DGV или ListView.
0
8 / 12 / 2
Регистрация: 25.12.2017
Сообщений: 280
26.10.2021, 06:42  [ТС]
В моем коде вроде нет привязки к наборам данных. Как тогда определить коллекцию, и сделать поиск по ней?

Мой старый рабочий поиск из DataGridView (в ListView нет таких методов перебора)


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
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.Threading;
 
namespace ACS_MAR_Nigma
{
    public partial class Form5 : Form
    {
        Form1 fgrid1;
        public Form5(Form1 f1)
        {
            InitializeComponent();
            this.fgrid1 = f1;
        }
        [System.ComponentModel.Browsable(false)]
        public int FirstDisplayedScrollingRowIndex { get; set; }
        //Найти оборудование в таблице
        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < fgrid1.dataGridView1.RowCount; i++)
            {
                fgrid1.dataGridView1.Rows[i].Selected = false;
                for (int j = 0; j < fgrid1.dataGridView1.ColumnCount; j++)
                    if (fgrid1.dataGridView1.Rows[i].Cells[j].Value != null)
                        if (fgrid1.dataGridView1.Rows[i].Cells[j].Value.ToString().Contains(textBox1.Text))
                        {         
                            // Выделение строки
                            fgrid1.dataGridView1.Rows[i].Selected = true;
                            // Пролистывание
                            fgrid1.dataGridView1.FirstDisplayedScrollingRowIndex = i;
                            break;
                        }
            }
        }
        //Отмена
        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
0
 Аватар для Andrey-MSK
3376 / 2262 / 388
Регистрация: 14.08.2018
Сообщений: 7,670
Записей в блоге: 4
26.10.2021, 06:56
Цитата Сообщение от Jim Reinor Посмотреть сообщение
В моем коде вроде нет привязки к наборам данных.
Как это нет, а это что?
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;
Это переписать на SqlDataReader, пример выше, получить из него коллекцию (тип нужной коллекции BindingList, у меня в примере просто List) и ее привязать к DGV или ListView. И дальше уже работать с ней - поиск, фильтр и т.д. Я вам про это и выше писал, работать с коллекцией, а не с элементом UI.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.10.2021, 06:56

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru