Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
2 / 3 / 2
Регистрация: 17.05.2013
Сообщений: 403
1

Как правильно завернуть в функцию условие с dataGridView?

21.05.2017, 22:29. Показов 2176. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть условие с помощью которого заносится данные в строки dataGridView из xml . Скажите как это все можно запихнуть в функцию в качестве параметра передать dataGridView1.Rows
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
        if (dataGridView1.Rows.Count > 0) //если в таблице больше нуля строк
            {
                MessageBox.Show("Очистите поле перед загрузкой нового файла.", "Ошибка.");
            }
            else
            {
                if (File.Exists("D:\\Data.xml")) // если существует данный файл
                {
                DataSet ds = new DataSet(); // создаем новый пустой кэш данных
                ds.ReadXml("D:\\Data.xml"); // записываем в него XML-данные из файла
                
                    foreach (DataRow item in ds.Tables["Employee"].Rows)
                    {
                        int n = dataGridView1.Rows.Add(); // добавляем новую сроку в dataGridView1
                        dataGridView1.Rows[n].Cells[0].Value = item["Name"]; // заносим в первый столбец созданной строки данные из первого столбца таблицы ds.
                        dataGridView1.Rows[n].Cells[1].Value = item["Age"]; // то же самое со вторым столбцом
                        dataGridView1.Rows[n].Cells[2].Value = item["Programmer"]; // то же самое с третьим столбцом
                    }
                }
                else
                {
                    MessageBox.Show("XML файл не найден.", "Ошибка.");
                }
            }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.05.2017, 22:29
Ответы с готовыми решениями:

Groovy Как правильно завернуть JavaFX приложение с JVM в инсталляционный файл?
Всем привет. Я Python-программист, поэтому не обладаю достаточными навыками работы с Java. Я в...

Как правильно вписать условие в функцию чтобы все работало?
В это условие... /* === Поиск === */ function search(){ $search = clear($_GET); ...

Как правильно вписать функцию в h-файл и правильно её отразить в основной функции?
Создать внешнюю библиотеку, в которой написана функция вывода символьного массива обратном ...

Как правильно вызвать функцию с указателем на другую функцию как параметр
Вот вариант: double f(double x) { ... } double k(double (*f)(double), double y) { ...

10
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
22.05.2017, 00:42 2
Хотите костыль на костыле? Возвращайте DataTable из функции, а его уже коомите датасорсу грида.
0
2 / 3 / 2
Регистрация: 17.05.2013
Сообщений: 403
22.05.2017, 09:07  [ТС] 3
hoolygan, Можно пример, я с# незнаком в основном php сайты. Это для курсовой, можете пример кинуть очень нужно.
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
22.05.2017, 10:09 4
У Вас костыль с самого начала. Некомильфо хранить строки напрямую в контролах. Это сильно ограничивает пространство для расширения. У каждого DataGridView есть свойство DataSource, которому можно скормить таблицу, и не нужно гавнокодить потом с построчным выводом, чем замедлять работу программы иногда в тысячи раз (если количество строк будет доходить до миллионов).
Конкретно под Ваш случай, если предположить, что используется FW > 4.0, и доступны ключевые слова async/await
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
private Task<DataTable> GetTable(string fileName)
        {
            return Task.Run(() =>
                {
                    DataTable dt = new DataTable();
                    try
                    {
                        if (!File.Exists(fileName))
                            throw new FileNotFoundException();
                        else
                        {
                            DataSet ds = new DataSet(); // создаем новый пустой кэш данных
                            ds.ReadXml("D:\\Data.xml"); // записываем в него XML-данные из файла
                            dt = ds.Tables["Employee"];
                        }
                        return dt;
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                });
        }
 
а уже в другом месте, где ждете - то
private async void SetDataSource()
        {
try
            {
                DataTable dt = await GetTable("D:\\Data.xml");
            }
            catch (Exception x)
            {
                MessageBox.Show(x.Message);
            }        }
0
2 / 3 / 2
Регистрация: 17.05.2013
Сообщений: 403
22.05.2017, 10:57  [ТС] 5
Мне по проще нужно мне еще тэсты на них писать))), хотя смысл остался тем же. Если я правильно понял что первая функция возвращает таблицу или пустой результат а во втором SetDataSource в зависимости от результата. возвращаем сообщение или заносим если не пустой результат. Уж извиняйте если что не так просто знаний не хватает.Я попытался вызвать GetTable() с путем к файлу а затем вызвать SetDataSource() но ничего что точно не так делаю покажите, пожалуйста, на примере вот исходник
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
        private void button1_Click(object sender, EventArgs e) //Добавление данных в форму
        {
            if (textBox1.Text == "")
            {
                MessageBox.Show("Заполните все поля.", "Ошибка.");
            }
            else
            {
                int n = dataGridView1.Rows.Add();
                dataGridView1.Rows[n].Cells[0].Value = textBox1.Text;
                dataGridView1.Rows[n].Cells[1].Value = numericUpDown1.Value;
                dataGridView1.Rows[n].Cells[2].Value = comboBox1.Text;
            }
        }
 
        private void button4_Click(object sender, EventArgs e) //сохранение данных из формы в XML
        {
            try
            {
                DataSet ds = new DataSet(); // создаем пока что пустой кэш данных
                DataTable dt = new DataTable(); // создаем пока что пустую таблицу данных
                dt.TableName = "Employee"; // название таблицы
                dt.Columns.Add("Name"); // название колонок
                dt.Columns.Add("Age");
                dt.Columns.Add("Programmer");
                ds.Tables.Add(dt); //в ds создается таблица, с названием и колонками, созданными выше
 
                foreach (DataGridViewRow r in dataGridView1.Rows) // пока в dataGridView1 есть строки
                {
                    DataRow row = ds.Tables["Employee"].NewRow(); // создаем новую строку в таблице, занесенной в ds
                    row["Name"] = r.Cells[0].Value;  //в столбец этой строки заносим данные из первого столбца dataGridView1
                    row["Age"] = r.Cells[1].Value; // то же самое со вторыми столбцами
                    row["Programmer"] = r.Cells[2].Value; //то же самое с третьими столбцами
                    ds.Tables["Employee"].Rows.Add(row); //добавление всей этой строки в таблицу ds.
                }
                ds.WriteXml("D:\\Data.xml");
                MessageBox.Show("XML файл успешно сохранен.", "Выполнено.");
            }
            catch
            {
                MessageBox.Show("Невозможно сохранить XML файл.", "Ошибка.");
            }
        }
 
        private void button5_Click(object sender, EventArgs e) //загрузка файла XML в форму
        {
            if (dataGridView1.Rows.Count > 0) //если в таблице больше нуля строк
            {
                MessageBox.Show("Очистите поле перед загрузкой нового файла.", "Ошибка.");
            }
            else
            {
                if (File.Exists("D:\\Data.xml")) // если существует данный файл
                {
                DataSet ds = new DataSet(); // создаем новый пустой кэш данных
                ds.ReadXml("D:\\Data.xml"); // записываем в него XML-данные из файла
                
                    foreach (DataRow item in ds.Tables["Employee"].Rows)
                    {
                        int n = dataGridView1.Rows.Add(); // добавляем новую сроку в dataGridView1
                        dataGridView1.Rows[n].Cells[0].Value = item["Name"]; // заносим в первый столбец созданной строки данные из первого столбца таблицы ds.
                        dataGridView1.Rows[n].Cells[1].Value = item["Age"]; // то же самое со вторым столбцом
                        dataGridView1.Rows[n].Cells[2].Value = item["Programmer"]; // то же самое с третьим столбцом
                    }
                }
                else
                {
                    MessageBox.Show("XML файл не найден.", "Ошибка.");
                }
            }
        }
 
        private void dataGridView1_MouseClick(object sender, MouseEventArgs e) // выбор нужной строки для редактирования
        {
            textBox1.Text = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
            int n = Convert.ToInt32(dataGridView1.SelectedRows[0].Cells[1].Value);
            numericUpDown1.Value = n;
            comboBox1.Text = dataGridView1.SelectedRows[0].Cells[2].Value.ToString();
        }
 
        private void button2_Click(object sender, EventArgs e) //редактирование
        {
            if (dataGridView1.SelectedRows.Count > 0)
            {
                int n = dataGridView1.SelectedRows[0].Index;
                dataGridView1.Rows[n].Cells[0].Value = textBox1.Text;
                dataGridView1.Rows[n].Cells[1].Value = numericUpDown1.Value;
                dataGridView1.Rows[n].Cells[2].Value = comboBox1.Text;
            }
            else
            {
                MessageBox.Show("Выберите строку для редактирования.", "Ошибка.");
            }
        }
 
        private void button3_Click(object sender, EventArgs e) //удалить выбранную строку
        {
            if(dataGridView1.SelectedRows.Count > 0)
            {
                dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index);
            }
            else
            {
                MessageBox.Show("Выберите строку для удаления.", "Ошибка.");
            }
        }
 
        private void button6_Click(object sender, EventArgs e) //очистить таблицу
        {
            if (dataGridView1.Rows.Count > 0)
            {
                dataGridView1.Rows.Clear();
            }
            else
            {
                MessageBox.Show("Таблица пустая.", "Ошибка.");
            }
        }
вот сам пример в файле если так удобней будетxml_writer.rar
0
2 / 3 / 2
Регистрация: 17.05.2013
Сообщений: 403
22.05.2017, 14:21  [ТС] 6
hoolygan,все равно не загружает данные
C#
1
2
3
4
5
6
7
8
            if (dataGridView1.Rows.Count > 0) //если в таблице больше нуля строк
            {
                MessageBox.Show("Очистите поле перед загрузкой нового файла.", "Ошибка.");
            }
            else
            {
                SetDataSource();
            }
Добавлено через 4 минуты
файл есть а данные не подгружает
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
22.05.2017, 14:24 7
Ну конечно же не загружает. Я написал пример, который возвращает таблицу, а таблицу нужно прикручивать к гриду, но у Вас нужно исправлять практически с нуля логику, так как Вы работаете напрямую с контролами, а я нет - я работаю напрямую с моделью данных. Поэтому и дал просто направление, куда стоило бы смотреть. Поставьте точку останова внутри функции SetDataSource(); - и посмотрите, когда в дебагере остановится - что будет внутри DataTable - должна быть именно Ваша таблица. Вот и ставьте ее в датасорс. А переделывать полностью приложение - у меня на это нету достаточно времени, да и особого желания, если честно.
0
2 / 3 / 2
Регистрация: 17.05.2013
Сообщений: 403
22.05.2017, 14:54  [ТС] 8
hoolygan, А заносить циклом или метод какой-то есть я просто не сталкивался с таким, взял точку останова сделал действительно там данные есть.
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
22.05.2017, 15:04 9
ну смотрите, если работать нехорошо, то можно сделать вместо
C#
1
DataTable dt = await GetTable("D:\\Data.xml");
поставить
C#
1
dataGridView1.DataSource = await GetTable("D:\\Data.xml");
Если правильно - то создать сущность (класс/модель), которая будет хранить данные и делать биндинг грида к сущности данных - но для этого переделывать почти все. Что Вы выберете - тем и пользуйтесь, оба решения рабочие, но за первое мне бы шеф руки повыкручивал, и премии лишил бы
0
2 / 3 / 2
Регистрация: 17.05.2013
Сообщений: 403
22.05.2017, 15:21  [ТС] 10
Цитата Сообщение от hoolygan Посмотреть сообщение
то создать сущность (класс/модель), которая будет хранить данные и делать биндинг грида к сущности данных - но для этого переделывать почти все
может у вас есть пример какой да я хотя бы по аналогии попробую, я в смысле очень похожий, потому что сомневаюсь что с лету смогу понять о чем речь
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
22.05.2017, 15:31 11
Ну а зачем далеко ходить? - Архитектура ПО в WinForms (FAQ & HowTo)
А так, придумать с ходу какой-то пример - у нас то они большие для рамок этого форума.
0
22.05.2017, 15:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.05.2017, 15:31
Помогаю со студенческими работами здесь

Как правильно написать условие?
появилась такая проблема как написать код допустим такой для выполнения проверки доступных для роли...

Как правильно записать условие?
В листе Excel есть 3 ячейки - A2 (дата начала), B2 (дата завершения), C2 (текущая дата) и ячейка...

Как правильно записать условие?
Как записать If(C==) Что если елементы масива равны буквам?

Как правильно поставить условие?
Сделал для бота функцию для управления компом через консоль, задумка была такая: отсылаешь ему...


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

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