Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 29.10.2017
Сообщений: 32
1

Как мне получить доступ к листу из другого метода класса?

20.12.2018, 03:28. Показов 2259. Ответов 18
Метки нет (Все метки)

Доброго времени суток!
Наткнулся на такую проблему. У меня есть список, с определенным набором данных и есть форма которая и должна добавлять новые данные в этот список. У меня была такая идея: при нажатии кнопки SAVE на форме, вызывается метод который добавляет информацию в уже существующий список. Но, к сожалению, не могу реализовать.

Прошу подсказать, возможно я вообще мыслю не в том направлении, спасибо!

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace App
{
   public class DataWorkers
    {
    
      public static List<Worker> Worker_List()
            {
            List<Worker> Worker_List = new List<Worker>();
            Worker_List.Add(new Worker()
            {
                First_Name = "Volodymyr", Middle_Name = "Igorovich", Last_Name = "Pashkovskyi",
                Mobile_Number = "0978745742", Email = "ivpoks@ukr.net", Adress = "Kuty",
                Department = "Testing department"
            });
            Worker_List.Add(new Worker()
            {
                First_Name = "Igor", Middle_Name = "Igorovich", Last_Name = "Petuhov", Mobile_Number = "0978758944",
                Email = "badabum@ukr.net", Adress = "Kosiv", Department = "Testing department"
            });
            Worker_List.Add(new Worker()
            {
                First_Name = "Petro", Middle_Name = "Pavlov", Last_Name = "Patonov", Mobile_Number = "0978745777",
                Email = "patom@ukr.net", Adress = "Ivano-Frankivsk", Department = "Testing department"
            });
            Worker_List.Add(new Worker()
            {
                First_Name = "Lilya", Middle_Name = "Andriivna", Last_Name = "Popotashu", Mobile_Number = "097844878",
                Email = "lilya@ukr.net", Adress = "Kolomyya", Department = "Testing department"
            });
 
 
            return Worker_List;
        }
 
         (ниже не рабочий кусок)
        public void AddWorker(...входные параметры имя, фамилия и тд...)
        {
            //тут должно быть что-то типа:
            Worker_List.Add( new Worker() First_Name = первый параметр, Middle_Name = второй и тд)
        }
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.12.2018, 03:28
Ответы с готовыми решениями:

Как получить доступ к переменной находящейся в одном методе из другого метода в пределах одного класса
Привет всем! Очередной вопрос новичка, допустим, у меня есть метод 1, в котором назначена...

Как получить доступ к переменной из другого метода с++
Хочу чтоб вводились дни по месяцам, например если февраль то не может быть в месяце 30 дней. Сделал...

как получить доступ к элементу формы из другого метода
1 есть метод инициализации компонентов формыpublic Form_test() { ...

Как получить доступ к DataGridView из другого класса
Есть форма Administrator, на ней DataGridView. Есть класс Admin_Panel, как из этого класса...

18
1435 / 839 / 313
Регистрация: 17.05.2015
Сообщений: 3,223
20.12.2018, 09:17 2
Цитата Сообщение от cyberNovichok Посмотреть сообщение
List<Worker> Worker_List = new List<Worker>();
надо вынести из метода и сделать полем класса DataWorkers
1
802 / 551 / 237
Регистрация: 01.07.2018
Сообщений: 1,810
20.12.2018, 09:45 3
cyberNovichok,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        class Worker_collection
        {
            public static List<Worker> wList = new List<Worker>(); 
        }
 
public List<Worker> Worker_List()
            {
            List<Worker> Worker_List = new List<Worker>(); //Это убрать
            Worker_collection.wList.Add(new Worker() //Здесь изменили на коллекцию из другого класса
            {
                First_Name = "Volodymyr", Middle_Name = "Igorovich", Last_Name = "Pashkovskyi",
                Mobile_Number = "0978745742", Email = "ivpoks@ukr.net", Adress = "Kuty",
                Department = "Testing department"
            });
В класс Worker лучше добавить конструктор.
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
        public class Worker
 
    {
        public Worker(string first_Name, string middle_Name, string last_Name, string mobile_Number, string email, string adress, string department)
        {
            First_Name = first_Name;
            Middle_Name = middle_Name;
            Last_Name = last_Name;
            Mobile_Number = mobile_Number;
            Email = email;
            Adress = adress;
            Department = department;
        }
 
            public string First_Name { get; set; }
            public string Middle_Name { get; set; }
            public string Last_Name { get; set; }
            public string Mobile_Number { get; set; }
            public string Email { get; set; }
            public string Adress { get; set; }
            public string Department { get; set; }
        }
//Так проще добавлять в коллекцию
Worker_collection.wList.Add(new Worker("Igor", "Igorovich", "Petuhov", "0978758944", "badabum@ukr.net", "Kosiv", "Testing department"));
Добавлено через 13 минут
P.S. А лучше так:
C#
1
2
3
4
5
        public List<Worker> Worker_List(List<Worker> wl)
        {
            wl.Add(new Worker("Petro", "Pavlov", "Patonov", "0978745777", "patom@ukr.net", "Ivano-Frankivsk", "Testing department"));
            return wl;
        }
1
1 / 1 / 0
Регистрация: 29.10.2017
Сообщений: 32
20.12.2018, 12:16  [ТС] 4
С листом вроде разобрался. Но теперь, почему-то, объект который я создаю в форме при нажатии кнопки save не появляется в списке при повторном выводе его.

Сделал перегрузку метода worker_list в надежде что это решит проблему(простой worker_list без параметров вызываем для того что бы заполнить "начальный" лист, а когда с параметрами - это уже от кнопки save )
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
namespace App
{
    public class DataWorkers
    {
        public static List<Worker> wList = new List<Worker>();
 
        public static void worker_list()
        {
            wList.Add(new Worker()
            {
                First_Name = "volodymyr",
                Middle_Name = "igorovich", Last_Name = "pashkovskyi",
                Mobile_Number = "0978745742", Email = "ivpoks@ukr.net", Adress = "kuty",
                Department = "testing department"
            });
        }
 
        public static void worker_list(string firstName, string middleName, string lastName, string mobNumber, string email, string adress, string departmentName)
            {
                wList.Add(new Worker()
                {
                    First_Name = firstName,
                    Middle_Name = middleName,
                    Last_Name = lastName,
                    Mobile_Number = mobNumber,
                    Email = email,
                    Adress = adress,
                    Department = departmentName
                });
            }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace App
{
    public partial class AddWorker : Form
    {
        public AddWorker()
        {
            InitializeComponent();
        }
 
        private void btn_Save_AddWorker_Click(object sender, EventArgs e)
        {
            DataWorkers.worker_list(first_name.Text, middleName.Text, last_Name.Text, middleName.Text, email.Text, adress.Text, departmentName.Text);
            this.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
namespace App
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
 
     
        private void btn_ShowWorkers_Click(object sender, EventArgs e)
        {
            DataWorkers.worker_list(); //должен заполнять "начальный" лист
            dataGridView1.DataSource = DataWorkers.wList;
        }
 
        private void btn_AddWorker_Click(object sender, EventArgs e)
        {
            AddWorker f = new AddWorker();
            f.Owner = this;
            f.Show();
        }
    }
}
0
802 / 551 / 237
Регистрация: 01.07.2018
Сообщений: 1,810
20.12.2018, 14:25 5
cyberNovichok, Что за метод такой public static void worker_list(string firstName, string middleName, string lastName, string mobNumber, string email, string adress, string departmentName) ? Для чего он. Класс Worker покажите.
0
1 / 1 / 0
Регистрация: 29.10.2017
Сообщений: 32
20.12.2018, 15:01  [ТС] 6
PoPsa85, у меня есть 2 метода worker_list, первый, простой не перегруженный, вызывается при открытие формы для того что бы заполнить первичиные данные в листе. Следующий, перегруженный, о котором вы спрашиваете, вызывается кнопкой save в форме где мы додаем нового рабочего в лист. Ну как говорится, "я так вижу".

Класс Workerнемного переделал его)
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
namespace App
{
    public class Worker
    {
        public string First_Name { get; set; }
        public string Middle_Name { get; set; }
        public string Last_Name { get; set; }
        public string Mobile_Number { get; set; }
        public string Email { get; set; }
        public string Adress { get; set; }
        public string Department { get; set; }
   
        public Worker()
        {
        }
 
        public static void addWorkerToList()
        {
            Data.w_List.Add(new Worker()
            {
                First_Name = "volodymyr",
                Middle_Name = "igorovich",
                Last_Name = "pashkovskyi",
                Mobile_Number = "0978745742",
                Email = "ivpoks@ukr.net",
                Adress = "kuty",
                Department = "testing department"
            });
        }
 
        public static void addWorkerToList(string firstName, string middleName, string lastName, string mobNumber, string email, string adress, string departmentName)
        {
            Data.w_List.Add(new Worker()
            {
                First_Name = firstName,
                Middle_Name = middleName,
                Last_Name = lastName,
                Mobile_Number = mobNumber,
                Email = email,
                Adress = adress,
                Department = departmentName
            });
            
        }
    }
}
Возможно моя идея вкорни плоха, буду очень рад если натолкнете на правильную

Добавлено через 23 минуты
После дебагинга понял, что данные все таки додаются в лист, вот только теперь мне нужно обновить dategridview(наверное), но сделать у меня это не получается никак((((((
0
802 / 551 / 237
Регистрация: 01.07.2018
Сообщений: 1,810
20.12.2018, 15:04 7
cyberNovichok, Вот так должен выглядеть ваш класс, никакие методы не нужны:
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
public class Worker
    {
        public string First_Name { get; set; }
        public string Middle_Name { get; set; }
        public string Last_Name { get; set; }
        public string Mobile_Number { get; set; }
        public string Email { get; set; }
        public string Adress { get; set; }
        public string Department { get; set; }
 
//Пустой конструктор
        public Worker()
        {
        }
//Первоначальная инициализация и заполнение списка.
        public static List<Worker> wList = new List<Worker>()
        {
            new Worker()
            {
                First_Name = "volodymyr",
                Middle_Name = "igorovich",
                Last_Name = "pashkovskyi",
                Mobile_Number = "0978745742",
                Email = "ivpoks@ukr.net",
                Adress = "kuty",
                Department = "testing department"
            }
        };
 
//Конструктор с параметрами
        public Worker(string first_Name, string middle_Name, string last_Name, string mobile_Number, string email, string adress, string department)
        {
            First_Name = first_Name;
            Middle_Name = middle_Name;
            Last_Name = last_Name;
            Mobile_Number = mobile_Number;
            Email = email;
            Adress = adress;
            Department = department;
        }
 
        
    }
//Так как в классе у вас два конструктора, добавлять значения вы можете либо так:
            Worker.wList.Add(new Worker()
            {
                First_Name = "volodymyr",
                Middle_Name = "igorovich",
                Last_Name = "pashkovskyi",
                Mobile_Number = "0978745742",
                Email = "ivpoks@ukr.net",
                Adress = "kuty",
                Department = "testing department"
            });
//Либо так
Worker.wList.Add(new Worker("volodymyr", "igorovich", "pashkovskyi", "0978745742", "ivpoks@ukr.net", "kuty", "testing department"));
//Не нужно изобретать методов для добавления элементов в коллекцию. Такой метод уже есть, называется Add
//Список уже заполнен элементами в классе, обращаемся к списку Worker.wList
//Можно проверить что лист заполнен
        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(Worker.wList.First().First_Name);
        }
1
1435 / 839 / 313
Регистрация: 17.05.2015
Сообщений: 3,223
20.12.2018, 15:04 8
У вас там сам черт запутается. Диагностировать баг не представляется возможным.
Цитата Сообщение от cyberNovichok Посмотреть сообщение
Возможно моя идея вкорни плоха, буду очень рад если натолкнете на правильную
У вас методы форм имеют доступ к модели приложения(DataWorkers), данные должны передаваться в модель, а не форма записывать данные в модель.
1
802 / 551 / 237
Регистрация: 01.07.2018
Сообщений: 1,810
20.12.2018, 15:08 9
Лучший ответ Сообщение было отмечено cyberNovichok как решение

Решение

Цитата Сообщение от cyberNovichok Посмотреть сообщение
вот только теперь мне нужно обновить dategridview
Для добавления записей в DGV используйте BindingList он извещает DGV об изменениях в коллекции.
C#
1
2
3
4
5
        private void Form1_Load(object sender, EventArgs e)
        {
            var myBindingList = new BindingList<Worker>(Worker.wList);
            dataGridView1.DataSource = myBindingList;
        }
1
1435 / 839 / 313
Регистрация: 17.05.2015
Сообщений: 3,223
20.12.2018, 15:09 10
Цитата Сообщение от PoPsa85 Посмотреть сообщение
Worker.wList.Add(new Worker()
вот так даже не пытайтесь делать, это бред, тупик.
Вся логика должна быть инкапсулирована классами.
Вот читайте Архитектура ПО в WinForms (FAQ & HowTo)
1
802 / 551 / 237
Регистрация: 01.07.2018
Сообщений: 1,810
20.12.2018, 15:11 11
Рядовой, То есть инициализация списка в классе это бред ?
0
1435 / 839 / 313
Регистрация: 17.05.2015
Сообщений: 3,223
20.12.2018, 15:14 12
PoPsa85, не перевирайте. Сами же видите что 3 подряд идущие слова worker уже сигнализируют о том, что надо все переписывать
0
802 / 551 / 237
Регистрация: 01.07.2018
Сообщений: 1,810
20.12.2018, 15:16 13
Рядовой, И какое отношение имеет этот список к форме ? В общем бред - это ваши высказывания не аргументированные, постоянное желание кого-то поправить и уверенность в том. что один вы знаете КАК правильно.
0
1435 / 839 / 313
Регистрация: 17.05.2015
Сообщений: 3,223
20.12.2018, 15:18 14
PoPsa85, а ваш аргумент это криво написанный код?
Цитата Сообщение от PoPsa85 Посмотреть сообщение
И какое отношение имеет этот список к форме ?
то есть в модели это адекватное явление?
3 подряд идущие слова worker
0
802 / 551 / 237
Регистрация: 01.07.2018
Сообщений: 1,810
20.12.2018, 15:20 15
Рядовой, А вы не про инициализацию говорите. Это просто пример, того как работает конструктор. И что не нужно создавать методы для добавления. С точки зрения класса, считаю всё тут на своем месте.
Еще раз повторю. Это пример заполнения списка. Без доп. методов.
0
1 / 1 / 0
Регистрация: 29.10.2017
Сообщений: 32
20.12.2018, 15:34  [ТС] 16
Это то что мне было нужно!! Теперь всё додается и выводится без проблем! Просто огромное спасибо!!
0
1435 / 839 / 313
Регистрация: 17.05.2015
Сообщений: 3,223
20.12.2018, 15:35 17
PoPsa85, просто для примера можно привести любой рабочий код.
Но это же ахтунг. ООП для того и придумали, что бы как минимум код был удобочитаемым.
cyberNovichok, в общем. Если надо чтобы работало - просто копируйте себе. Если надо научится - то надо почитать теории.
1
1 / 1 / 0
Регистрация: 29.10.2017
Сообщений: 32
20.12.2018, 15:37  [ТС] 18
Возможно это и неправильно, но я думаю на моём уровне знания языка пока и этого хватит
Спасибо за статейку, пойду изучать!
0
802 / 551 / 237
Регистрация: 01.07.2018
Сообщений: 1,810
20.12.2018, 16:08 19
Рядовой, Рядовой, 3 раза. Worker ему не нравится. Ахтунг у вас в голове уважаемый. Дальше спорить нет смысла.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2018, 16:08

Как получить доступ к массиву из другого класса?
Подскажите, есть такой код: switch(o_field.fieldArray) { // Код } Этот код находится в...

Как получить доступ к CardLayout из другого класса?
Здравствуйте, в общем суть вопроса такова. Есть два класса MainClass и SubClass в MainClasss...

Как получить доступ к переменной из другого класса
namespace ViewModel { public class AFViewModel : ViewModelBase { private int _SecPauseDel = 0;...

Как получить доступ к объекту другого класса
Здравствуйте друзья. Прошу помощи по вопросу В главном viewController cоздаю объект Label и...


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

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

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