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

Как получить доступ к списку List из другой формы?

29.02.2016, 02:40. Показов 4094. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Если можно пример
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.02.2016, 02:40
Ответы с готовыми решениями:

Как получить доступ к контролу из другой формы
Здраствуйте, прочитав это https://www.cyberforum.ru/windows-forms/thread110436.html#post629892, я...

Как получить доступ из одной формы к другой?
Как получить доступ из одной формы к другой? Есть текстовый редактор, на нем есть кнопка...

Как получить доступ к элементам управления другой формы
как можно получит значение элементов первой формы если в проекте 2 формы Form1 f = new Form1();...

Как получить доступ к объекту класса из другой формы?
В файле создан класс с одним полем (это для начала). Есть две формы. Создаю в одной из них объект...

14
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
29.02.2016, 02:47 2
Ответы на данный вопрос тут, он за день по несколько раз задается...
0
0 / 0 / 1
Регистрация: 27.09.2015
Сообщений: 121
29.02.2016, 02:50  [ТС] 3
EvilFromHell, т.е. нужно вызвать метод Invoke?
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
29.02.2016, 02:52 4
Green01, причем тут это? Invoke-это для доступа к контролам формы из другого потока. А GUI весь находится в одном потоке(обычно, если не извращаться). Там по ссылке написано про передачу данных между классами разными способами, в частности, про события, которые являются наиболее правильным способом это делать.
1
0 / 0 / 1
Регистрация: 27.09.2015
Сообщений: 121
29.02.2016, 03:06  [ТС] 5
EvilFromHell, спасибо за ссылку и ответ) но все же непонятно как именно к листу обратиться форма обязательно должна быть дочерней?

Добавлено через 8 минут
я просто к контролам еще понимаю как обратиться, но List ведь вроде не контрол
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
29.02.2016, 03:29 6
Green01, какая разница, объект какого класса передавать? Суть от этого ничуть не меняется.
Цитата Сообщение от Green01 Посмотреть сообщение
форма обязательно должна быть дочерней?
Нет. Опять же, форма, или любой другой класс-не имеет особо значения.
0
0 / 0 / 1
Регистрация: 27.09.2015
Сообщений: 121
29.02.2016, 06:30  [ТС] 7
К сожалению, без примера с List не могу разобраться! может кто-нибудь еще поможет?

Добавлено через 49 минут
А вообще проблема такая:
Мне нужно передать строку из базы данных в форму редактирования в соответствующие текстбоксы и комбобокс. Данные передаются по клику на строку datagridview.
Источником комбобокса является List
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
public void ResortUpdateForm_Load(object sender, EventArgs e)
        {
            SqlConnection sqlConnection1 = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|TuristicheskoeAgentstvo.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
            sqlConnection1.Open();
            SqlCommand sqlCommand1 = new SqlCommand();
            sqlCommand1.Connection = sqlConnection1;
            sqlCommand1.CommandText = @"SELECT * FROM Country";
            sqlCommand1.Connection = sqlConnection1;
            List<Country> countryes = new List<Country>();
            {
                SqlDataReader dr = sqlCommand1.ExecuteReader();
                while (dr.Read()) // создание и заполнение объекта
                {
                    Country coun = new Country
                    {
                        id = int.Parse(dr["id_country"].ToString()),
                        name = (string)dr["name_country"]
                    };
                    countryes.Add(coun); // добавление в лист
                }
            }
            comboBox1.DataSource = countryes;
            comboBox1.DisplayMember = "name";
            comboBox1.ValueMember = "id";
            sqlConnection1.Close();
 
        }
 
        public class Country
        {
            public int id { get; set; }
            public string name { get; set; }
            public override string ToString()
            {
                return string.Format("id: {0}, name: {1}", id, name);
            }
        }
Из главной формы нужно обратиться к листу, узнать в нем индекс выбранного элемента и вставить в комбобокс

Добавлено через 2 минуты
а это код, которым передаю строку в форму редактирования:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            ResortUpdateForm newForm10 = new ResortUpdateForm();
            int id = 0;
            id = Convert.ToInt32(dataGridView1.Rows[dataGridView1.SelectedCells[0].RowIndex].Cells[0].Value);
            SqlConnection sqlConnection1 = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|TuristicheskoeAgentstvo.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
            sqlConnection1.Open();
            SqlCommand sqlCommand1 = new SqlCommand();
            sqlCommand1.Connection = sqlConnection1;
            sqlCommand1.CommandText = @"SELECT [Resort].id_resort, [Resort].name_resort, [Resort].id_country FROM Resort WHERE [Resort].id_resort = @id";
            sqlCommand1.Connection = sqlConnection1;
            sqlCommand1.Parameters.Add(new SqlParameter("@id", id));
            IDataReader reader = sqlCommand1.ExecuteReader();
            reader.Read();
            newForm10.textBox1.Text = reader.GetInt32(0).ToString();
            newForm10.textBox2.Text = reader.GetString(1);
            newForm10.comboBox1.SelectedValue = reader.GetInt32(2).ToString();
            reader.Close();
            sqlConnection1.Close();
            if (newForm10.ShowDialog() == DialogResult.OK)
                resortTableAdapter.Fill(turisticheskoeAgentstvoDataSet.Resort);
        }
}
Добавлено через 1 минуту
Как привязать List к главной форме?

Добавлено через 56 минут
0
0 / 0 / 1
Регистрация: 27.09.2015
Сообщений: 121
01.03.2016, 10:01  [ТС] 8
подскажите пожалуйста какое-нибудь решение
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
01.03.2016, 10:19 9
Green01, в FAQ, на которое я кидал ссылку, приведен пример как раз про базу.

По коду-мне не слишком понятно, в чем же проблема. Что мешает у ResortUpdateForm просто сделать публичный метод, который будет искать что-то в листе исходя из нужных параметров и возвращать значение? Ведь у вас ResortUpdateForm все одно открывается через ShowDialog, а соответственно, инициатором передачи ей быть и не надо. Достаточно вызывать после ShowDialog этот самый метод, о котором я писал выше. Даже и событий не надо.
Лист у вас, как я вижу, создан локально, поэтому к нему вы обращаться сможете только через свойство DataSource у комбобокса. Не проще ли объявить его полем?
Да, и вот так делать:
C#
1
2
3
            newForm10.textBox1.Text = reader.GetInt32(0).ToString();
            newForm10.textBox2.Text = reader.GetString(1);
            newForm10.comboBox1.SelectedValue = reader.GetInt32(2).ToString();
Очень дурной тон
0
0 / 0 / 1
Регистрация: 27.09.2015
Сообщений: 121
01.03.2016, 10:36  [ТС] 10
EvilFromHell,
а почему это дурной тон? вроде много подобных примеров встречается
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
01.03.2016, 10:42 11
Лучший ответ Сообщение было отмечено Green01 как решение

Решение

Green01, сделайте лучше во второй форме конструктор, принимающий параметры, или соответствующий метод, который будет расставлять значения по текстбоксам. А делать контролы публичными и что-то на них дергать откуда-то извне-это нарушает инкапсуляцию и создает путаницу. Вы потом сами не разберетесь, что происходит на второй форме, если контролы на ней будут дергаться еще из 10ти мест извне. Надо, чтобы вся работа с контролами какой-то формы происходила внутри самой же формы. А извне были доступны только соответствующие методы, которые уже все выставляют. И желательно, чтобы они были названы так, чтобы без комментариев было ясно, что они делают.
1
0 / 0 / 1
Регистрация: 27.09.2015
Сообщений: 121
01.03.2016, 10:50  [ТС] 12
EvilFromHell, спасибо за ответ! да нужно пробовать делать, как Вы говорите, хотя это еще слишком для меня сложно) на счет ссылки, там ведь получают данные из формы и из класса, про базу вроде ничего нет?
и еще вопрос: даже с дочерними формами так нельзя делать?
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
01.03.2016, 11:18 13
Green01, вообще по правилам хорошего тона любой класс(в том числе форма) должен инкапсулировать в себе какой-то функционал, и его не должно быть можно ввести в недопустимое состояние извне. Класс должно быть можно перенести в другой проект без особых заморочек, и там с ним работать. А так, как у вас, можно, допустим, написать:
C#
1
 newForm10.textBox2 = null;
И все, на второй форме начнутся вылеты. И их причина на второй форме будет не видна. Это не есть правильно.

Добавлено через 15 минут
Green01, про базу действительно нет, невнимательно смотрел, но от DataTable до базы совсем недалеко А суть задачи очень близкая.
1
0 / 0 / 1
Регистрация: 27.09.2015
Сообщений: 121
01.03.2016, 11:44  [ТС] 14
Цитата Сообщение от EvilFromHell Посмотреть сообщение
Green01, про базу действительно нет, невнимательно смотрел, но от DataTable до базы совсем недалеко А суть задачи очень близкая.
но только туда еще ADO.NET каким-то образом надо накрутить
а вообще вот про все эти методы и конструкторы, о которых Вы выше написали можно почитать где-нибудь, чтобы на примерах объясняли?
MSDN пока тяжело воспринимать
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
01.03.2016, 11:58 15
Green01, ну про основы ООП инфы море по первой же ссылке в гугле. Где наиболее понятно-с ходу не скажу. На счет ADO.NET-это все лишь набор классов для работы с базой из dllки System.Data.dll. Класс DataTable(и DataSet), кстати говоря, тоже оттуда, и одно из его основных предназначений-как раз таки работа с базой.
0
01.03.2016, 11:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2016, 11:58
Помогаю со студенческими работами здесь

Получить доступ к ComboBox другой формы
Доброго всем. Есть у меня 2 формы -Form1 и Form 2. Form2 имеет свойство FormBorderStyle как...

Как из дочерней формы получить доступ к элементу управления родительской формы
Есть две формы: родительская(Form1) и дочерняя(Form2). В родительской форме(Form1) находятся...

Как из второй формы получить доступ ко всем формам первой формы?
Как?

Как получить доступ к элементам формы из другого обычного класса (не из второй формы)
Сабж. В гугле вся инфа только про доступ из другой формы, это я знаю. А вот как получить доступ из...


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

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