Как хранить юнитов в листе, при создании разных экземпляров классов?
В общем, у меня есть 10 юнитов, я их создаю в одной в классе, автоматически по сути в конструкторе формы, потом открываю другую форму и там добавляю ещё одного юнита или 2-х, закрываю форму создания и открываю снова первую форму и соответственно в первом снова вызывается конструктор и кол-во юнитов вновь становится = 10, как и было ранее, а мой созданный юнит 11-ый удаляется, он же из другого экземпляра формы, подскажите где хранить этих юнитов, чтобы они не удалялись?
вот сервис
public class AppService : IAppService
{
public List<ServerUser> Users;
public List<ServerUser> MakeList()
{
ServerUser AlexUser = new ServerUser()
{
Id = 1,
Name = "Alex",
SecondName = "Vasilich",
NameOfFamily = "Melentyev",
Age = 26,
Faculty = "ITS",
Course = 9,
};
ServerUser JeffUser = new ServerUser()
{
Id = 2,
Name = "Jeff",
SecondName = "Big",
NameOfFamily = "lebowski",
Age = 126,
Faculty = "no",
Course = 10,
};
ServerUser PetrUser = new ServerUser()
{
Id = 3,
Name = "Petr",
SecondName = "First",
NameOfFamily = "Romanov",
Age = 235,
Faculty = "Shipbuilding",
Course = 36,
};
ServerUser ChubaisUser = new ServerUser()
{
Id = 4,
Name = "Anatoly",
SecondName = "Борисович",
NameOfFamily = "Chubais",
Age = 65,
Faculty = "Faculty of Nanotechnology",
Course = 36,
};
ServerUser PutinUser = new ServerUser()
{
Id = 5,
Name = "V.V.",
SecondName = "Krasavchik",
NameOfFamily = "Putin",
Age = 68,
Faculty = "Faculty of Longevity",
Course = 36,
};
ServerUser CooperUser = new ServerUser()
{
Id = 6,
Name = "Sheldon",
SecondName = "Li",
NameOfFamily = "Cooper",
Age = 30,
Faculty = "Faculty of Physics",
Course = 136,
};
ServerUser StrycaloUser = new ServerUser()
{
Id = 7,
Name = "Yura",
SecondName = "--",
NameOfFamily = "Kaplan",
Age = 65,
Faculty = "Faculty of Music",
Course = 36,
};
ServerUser MessiUser = new ServerUser()
{
Id = 8,
Name = "Lionel",
SecondName = "Andreas",
NameOfFamily = "Messi",
Age = 65,
Faculty = "Faculty of Footabll",
Course = 36,
};
ServerUser TalUser = new ServerUser()
{
Id = 9,
Name = "Michail",
SecondName = "Nehemevich",
NameOfFamily = "Tal",
Age = 65,
Faculty = "Faculty of Chess",
Course = 36,
};
ServerUser NoNameUser = new ServerUser()
{
Id = 10,
Name = "NoName",
SecondName = "NoSecondName",
NameOfFamily = "NoNameOfFamily",
Age = 65,
Faculty = "no",
Course = 36,
};
Users = new List<ServerUser>();
Users.Add(AlexUser);
Users.Add(JeffUser);
Users.Add(PetrUser);
Users.Add(ChubaisUser);
Users.Add(PutinUser);
Users.Add(CooperUser);
Users.Add(StrycaloUser);
Users.Add(MessiUser);
Users.Add(TalUser);
Users.Add(NoNameUser);
return Users;
}
public ServerUser[] GetInfoAboutUsersByAge(int age, ServerUser[] users)
{
var tempList = new List<ServerUser>();
var tempList2 = users.Where(u => u.Age == age).ToList();
ServerUser[] usersArr = tempList2.ToArray<ServerUser>();
return usersArr;
}
private ServerUser[] ConvertToUsersArr(List<ServerUser> users)
{
ServerUser[] massiv = users.ToArray<ServerUser>();
return massiv;
}
public ServerUser[] GetInfoAboutUsersByCourse(int course, ServerUser[] users)
{
var tempList = new List<ServerUser>();
tempList = users.Where(u => u.Course == course).ToList();
ServerUser[] usersArr = tempList.ToArray<ServerUser>();
return usersArr;
}
public ServerUser[] GetInfoAboutUsersByFaculty(string faculty, ServerUser[] users)
{
var tempList = new List<ServerUser>();
tempList = users.Where(u => u.Faculty == faculty).ToList();
ServerUser[] usersArr = tempList.ToArray<ServerUser>();
return usersArr;
}
public ServerUser GetInfoAboutUsersByNum(int num, ServerUser[] users)
{
var user = users.FirstOrDefault(n => n.Id == num);
return user;
}
public ServerUser ShowInfoAboutUsersByName(string name, ServerUser[] users)
{
var user = users.FirstOrDefault(n => n.Name == name);
return user;
}
string IAppService.ShowInfoAboutUsers()
{
string all = string.Empty;
foreach (var user in Users)
{
all += $"Name: {user.Name} Second Name: {user.SecondName} Name Of Family: {user.NameOfFamily} Faculty: {user.Faculty} Age: {user.Age} Course: {user.Course}";
all += "\n";
}
return all;
}
public ServerUser Edit(int id, string name, string secondName, string nameOfFamily, string faculty, int age, int course)
{
int nextId = id;
ServerUser newUser = new ServerUser()
{
Id = nextId,
Name = name,
SecondName = secondName,
NameOfFamily = nameOfFamily,
Faculty = faculty,
Age = age,
Course = course
};
return newUser;
}
public ServerUser Save(int countUsers, string name, string secondName, string nameOfFamily, string faculty, int age, int course)
{
ServerUser newUser = new ServerUser()
{
Id = ++countUsers,
Name = name,
SecondName = secondName,
NameOfFamily = nameOfFamily,
Faculty = faculty,
Age = age,
Course = course
};
return newUser;
}
public ServerUser DeleteId(int num, ServerUser[] users)
{
var user = users.FirstOrDefault(u => u.Id == num);
return user;
}
public List<string> ShowFaculties(ServerUser[] users)
{
List<string> Faculies = new List<string>();
foreach (var item in users)
{
if (!Faculies.Contains(item.Faculty))
{
Faculies.Add(item.Faculty);
}
}
return Faculies;
}
}
Вот клиент
public partial class FormStudents : Form
{
AppService AppService = new AppService();
AppServiceClient client;
CreateForm create;
public FormStudents()
{
client = new AppServiceClient();
InitializeComponent();
}
private List<ServerUser> UpdateTbl(List<ServerUser> users)
{
List<ServerUser> users2 = new List<ServerUser>();
if (users.Count > 0)
{
foreach (var user in users)
{
users2.Add(user);
}
}
else
{
MessageBox.Show("users not found");
}
return users2;
}
private void btnSearchAll_Click(object sender, EventArgs e)
{
dgvStudents.DataSource = UpdateTbl(AppService.Users);
}
private ServerUser[] ConvertToUsersArr()
{
ServerUser[] massiv = AppService.Users.ToArray<ServerUser>();
return massiv;
}
private void btnSearchId_Click(object sender, EventArgs e)
{
ServerUser serU = new ServerUser();
List<ServerUser> lU = new List<ServerUser>();
try
{
serU = client.GetInfoAboutUsersByNum(int.Parse(tbId.Text), ConvertToUsersArr());
lU.Add(serU);
dgvStudents.DataSource = lU;
}
catch (Exception)
{
MessageBox.Show("incorrectly filled fields");
}
ClearFields();
}
private void ClearFields()
{
tbName.Clear();
tbSecName.Clear();
tbNameOfFam.Clear();
tbFac.Clear();
tbId.Clear();
tbAge.Clear();
tbCourse.Clear();
}
private void btnSearchName_Click(object sender, EventArgs e)
{
ServerUser serU = new ServerUser();
List<ServerUser> lU = new List<ServerUser>();
serU = client.ShowInfoAboutUsersByName(tbName.Text, ConvertToUsersArr());
if (serU != null)
{
lU.Add(serU);
dgvStudents.DataSource = lU;
}
else
{
MessageBox.Show("incorrectly filled fields");
}
ClearFields();
}
private void btgSearchAge_Click(object sender, EventArgs e)
{
ServerUser[] lU;
try
{
dgvStudents.DataSource = lU = client.GetInfoAboutUsersByAge(int.Parse(tbAge.Text), ConvertToUsersArr());
}
catch (Exception)
{
MessageBox.Show("incorrectly filled fields");
}
ClearFields();
}
private void btnSearchCourse_Click(object sender, EventArgs e)
{
ServerUser serU = new ServerUser();
ServerUser[] lU;
try
{
dgvStudents.DataSource = lU = (client.GetInfoAboutUsersByCourse(int.Parse(tbCourse.Text), ConvertToUsersArr()));
}
catch (Exception)
{
MessageBox.Show("incorrectly filled fields");
}
ClearFields();
}
private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
{
ServerUser serU = new ServerUser();
ServerUser[] lU;
try
{
dgvStudents.DataSource = lU = client.GetInfoAboutUsersByFaculty(comboBoxFac.SelectedItem.ToString(), ConvertToUsersArr());
}
catch (Exception)
{
MessageBox.Show("incorrectly filled fields");
}
ClearFields();
}
private void btnGoToCreate_Click(object sender, EventArgs e)
{
this.Hide();
create = new CreateForm();
create.Show();
}
private void btnDownload_Click(object sender, EventArgs e)
{
AppService.MakeList();
comboBoxFac.DataSource = AppService.ShowFaculties(ConvertToUsersArr());
}
}
И вторая форма
public partial class CreateForm : Form
{
AppService AppService = new AppService();
AppServiceClient client;
FormStudents fs = new FormStudents();
public CreateForm()
{
AppService.MakeList();
client = new AppServiceClient();
InitializeComponent();
}
private void ClearFields()
{
tbName.Clear();
tbSecName.Clear();
tbNameOfFam.Clear();
tbFac.Clear();
tbAge.Clear();
tbCourse.Clear();
}
private void btnCreate_Click(object sender, EventArgs e)
{
//WriteInToFile();
string Name = tbName.Text;
string SecondName = tbSecName.Text;
string NameOfFamily = tbNameOfFam.Text;
string Faculty = tbFac.Text;
string Age = tbAge.Text;
string Course = tbCourse.Text;
try
{
AppService.Users.Add(client.Save(AppService.Users.Count, Name, SecondName, NameOfFamily, Faculty, int.Parse(Age), int.Parse(Course)));
ClearFields();
MessageBox.Show($"student with name {Name} created");
//usersTbl.ItemsSource = UpdateTbl(service.Users);
}
catch (Exception)
{
MessageBox.Show("incorrectly filled fields");
}
}
private void btnBack_Click(object sender, EventArgs e)
{
this.Hide();
fs.Show();
}
}
Ответы (1 шт):
Есть такая штука - внедрение зависимости, или Dependency Injection (DI). Звучит страшно, но на деле работает очень просто. Самая популярная разновидность DI - Constructor Injection, то есть просто вызов конструктора дочернего класса с аргументами.
Покажу на простом примере: к примеру у вас есть 2 формы, форма 1 - главная, показывает дочернюю форму. С точки зрения ООП у вас есть ошибка, вы каждый раз пересоздаете вторую форму при этом не закрывая её после использвоания в предыдущий раз. Прятать основную форму необязательно, достаточно использовать вызов дочерней формы как диалога.
К примеру у вас есть класс данных.
public class User
{
public string Name { get; set; }
}
Главная форма имеет коллекцию с этими юзерами и как-то его загружает
public partial class MainForm : Form
{
private List<User> _users;
private void LoadUsers()
{
_users = LoadUsersFromServer(); // здесь может быть любой код загрузки
}
}
И есть дочерняя форма, которая этот список хочет редактировать. И чтобы список принять, сделаю так, чтобы конструктор дочерней формы мог принимать этот список в себя как аргумент.
public partial class EditForm : Form
{
private List<User> _users;
public EditForm(List<User> users)
{
InitializeComponent();
_users = users;
}
}
Тогда вызов и передача данных из главной формы дочерней будет выглядеть так
private void button1_Click(object sender, EventArgs e)
{
Form dialog = new EditForm(_users); // cписок _users передается с помощью Constructor Injection в дочернюю форму
if (dialog.ShowDialog(this) == DialogResult.OK)
{
// дочерняя форма закрыта, список наверное изменился
}
}
Всё. Теперь дочерняя форма может работать со тем же самым списком _users.
Чтобы вернуть правильный DialogResult, назначьте его значение кнопкам в дочерней форме, при этом вам больше не понадобится вызывать .Hide(). При нажатии на кнопку форма закроется сама и вернет тот DialogResult, который назначен кнопке в дизайнере. Вы даже обработчики событий этих кнопок можете убрать из кода.
Кстати при вызове диалога таким образом вам открываются всякие визуальные фишки, например если вы дочерней форме зададите StartPosition как CenterParent, то она появится ровно по центру родительской формы.