Помогите с событиями разобраться!
public partial class FormStudents : Form
{
AppService AppService = new AppService();
AppServiceClient client;
public FormStudents()
{
client = new AppServiceClient();
_users = AppService.MakeList();
InitializeComponent();
dgvStudents.ReadOnly = true;
}
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)
{
Iterate(_users);
dgvStudents.DataSource = UpdateTbl(iteratedList);
lblUpdate.Visible = false;
}
List<ServerUser> iteratedList;
private List<ServerUser> Iterate(List<ServerUser> us)
{
iteratedList = new List<ServerUser>();
iteratedList = us.OrderBy(x => x.Id).ToList<ServerUser>();
return iteratedList;
}
public 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();
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 List<ServerUser> _users;
private void FormStudents_Load(object sender, EventArgs e)
{
comboBoxFac.DataSource = AppService.ShowFaculties(ConvertToUsersArr());
}
private void btnGoToCreate_Click(object sender, EventArgs e)
{
CreateForm dialog = new CreateForm(_users);
if (dialog.ShowDialog(this) == DialogResult.OK)
{
}
lblUpdate.Visible = true;
}
private void dgvStudents_SelectionChanged(object sender, EventArgs e)
{
btnEdit.Visible = true;
}
ServerUser user;
private void btnEdit_Click(object sender, EventArgs e)
{
var userId = this.dgvStudents.SelectedCells[0].RowIndex + 1;
user = _users.FirstOrDefault(x => x.Id == userId);
//EditForm.StudentUpdated += EditMeth;
EditForm.StudentUpdated += EditMeth;
//EditMeth(user, _users);
//EditForm editForm = new EditForm(user, _users);
EditForm editForm = new EditForm(client, user, _users);
if (editForm.ShowDialog(this) == DialogResult.OK)
{
}
lblUpdate.Visible = true;
}
У меня есть две формы, даже три, но не суть. Одна главная и две редактировать и создавать юнитов. Вот первая форма:
public void EditMeth()
{
_users.Remove(user);
//_users.Add(client.Save(user.Id - 1, tbName3.Text, tbSecName3.Text, tbNameOfFam3.Text, cmbFac.SelectedItem.ToString(), int.Parse(tbAge3.Text), int.Parse(tbCourse3.Text)));
MessageBox.Show($"student with name {user.Name.ToString()} edited");
}
}
Вот форма для редактирования
public partial class EditForm : Form
{
public delegate void WithParams(ServerUser su, List<ServerUser> users);
ServerUser _user;
List<ServerUser> _users;
AppServiceClient _client;
public static event Action StudentUpdated;
public EditForm(AppServiceClient client, ServerUser serU, List<ServerUser> users)
{
_user = serU;
_users = users;
_client = client;
InitializeComponent();
}
private void EditForm_Load(object sender, EventArgs e)
{
tbId3.Text = _user.Id.ToString();
tbName3.Text = _user.Name;
tbSecName3.Text = _user.SecondName;
tbNameOfFam3.Text = _user.NameOfFamily;
cmbFac.DataSource = _client.ShowFaculties(_client.ConvertToUsersArr(_users.ToArray()));
cmbFac.SelectedItem = _user.Faculty;
tbCourse3.Text = _user.Course.ToString();
tbAge3.Text = _user.Age.ToString();
}
private void btnEdit_Click(object sender, EventArgs e)
{
var delUser = _users.FirstOrDefault(x => x.Id == _user.Id);
//StudentUpdated.Invoke(delUser, _users);
StudentUpdated.Invoke();
_users.Remove(delUser);
_users.Add(_client.Save(_user.Id - 1, tbName3.Text, tbSecName3.Text, tbNameOfFam3.Text, cmbFac.SelectedItem.ToString(), int.Parse(tbAge3.Text), int.Parse(tbCourse3.Text)));
MessageBox.Show($"student with name {delUser.Name.ToString()} edited");
this.Hide();
}
}
Вот комментарий наставника "Ты передаешь список всех юзеров в Create и Edit форм, но им эта информация не нужна. Лучше в момент обновления/создания студента генерировать событие StudentUpdated/Created которые будет обрабатывать главная форма."
вот эта фраза "в момент обновления/создания студента генерировать событие StudentUpdated/Created которые будет обрабатывать главная форма." мне не понятна... по конкретнее может объяснит кто, где я должен создавать событие, где его вызывать и какой метод к нему привязать и в какой форме делать это?
Ответы (1 шт):
Объясняю :) на примере двух форм
- Первая форма основная
- Вторая форма добавить пользователя
первая форма выглядит так:
вторая форма выглядит так:

у нас есть класс студент которого мы будем добавлять во второй форме
public class Student
{
public string Name { get; set; }
public string SurName { get; set; }
public int Age { get; set; }
public Student(string name,string surname,int age)
{
this.Name = name;
this.SurName = surname;
this.Age = age;
}
}
код первой формы
/// <summary>
/// Форма номер 1
/// </summary>
public partial class Form1 : Form
{
/// <summary>
/// Список содержит список всех студентов
/// </summary>
private List<Student> StudentsList;
/// <summary>
/// Переменная воторой формы
/// </summary>
CreateForm createFrom;
/// <summary>
/// конструктор первой формы
/// </summary>
public Form1()
{
InitializeComponent();
//инизиализируем список студентов
StudentsList = new List<Student>();
}
private void Form1_Load(object sender, EventArgs e)
{
}
//кнопка номер 1 октрываёт форму (CreateForm) где мы добавляем пользователя
private void button1_Click(object sender, EventArgs e)
{
//инициализируем форму 2
createFrom = new CreateForm();
//подписываемся на событие добавление нового студента во второй форме
createFrom.OnStudentCreated += AddNewStudent;
//показываем диалог второй формы
createFrom.ShowDialog();
//отписываемся от события добавление нового студента
createFrom.OnStudentCreated -= AddNewStudent;
}
/// <summary>
/// Метод добавляет нового пользователя в список
/// </summary>
private void AddNewStudent()
{
//проверка на null
if (createFrom != null)
{
//проверка на null
if (createFrom.CreatedStuden != null)
{ //добаляем нового пользовтеля в список
StudentsList.Add(createFrom.CreatedStuden);
}
}
}
}
код второй формы
/// <summary>
/// Форма 2 создание студента
/// </summary>
public partial class CreateForm : Form
{
//делагат
public delegate void StudentCreated();
//событие создание нового студента
public event StudentCreated OnStudentCreated;
//класс-переменная студента
public Student CreatedStuden;
public CreateForm()
{
InitializeComponent();
}
private void CreateForm_Load(object sender, EventArgs e)
{
}
//кнопка создать нового пользователя
private void btn_create_Click(object sender, EventArgs e)
{
//проверяем все ли поля заполнил пользователь
if(tx_name.Text.Length>0 && tx_surname.Text.Length>0 && tx_age.Text.Length>0)
{
string name = tx_name.Text;
string surname = tx_surname.Text;
int age = 0;
//проверям вел ли пользователь цифры
if (Int32.TryParse(tx_age.Text, out age))
{
CreatedStuden = new Student(name, surname, age);
OnStudentCreated();
Hide();
}
else//ошибка пользователь ввел в место возраста что то другое
{
MessageBox.Show("Age field can contain only digits", "Error message", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else//ошибка не все поля были заполнены верно
{
MessageBox.Show("Can't create new user one of fields is empty", "Error message", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
Как это работает: когда мы в форме 1 нажимаем на кнопку button1 мы подписываемся на событие, которое сработает: если все поля будут правильно заполнены в форме 2 и пользователь нажмет кнопку Create new Student. В второй форме сработает событие OnStudentCreated(); и будут вызваны все методы которые подписаны на данное событие в нашем случаи это метод в форме 1 AddNewStudent(), когда он сработает новый студент будет добавлен в список StudentsList.
как то так :)