#c# #forms #editing
#c# #формы #редактирование
Вопрос:
В моей программе я разрешаю пользователю выбирать запись студента из окна списка, когда они нажимают кнопку редактирования, открывается новая форма. В этой форме отображаются идентификатор и отметка выбранного учащегося. Я должен разрешить пользователю редактировать эту метку и обновлять поле списка. У меня возникли проблемы с разрешением пользователю редактировать, и я был бы признателен за любые советы по этому поводу. (У меня возникли проблемы с пониманием того, что делать, когда у меня есть данные пользователя внутри формы редактирования)
Мне не разрешено использовать LINQ, поэтому я был бы очень признателен за решение или совет о том, как сделать это без него.
Основная форма:
private void btnEditMark_Click(object sender, EventArgs e) {
string[] s_rec_arr;
if (lstMarks.SelectedIndex == -1) {
MessageBox.Show("please select a student");
} else {
ModuleData.s_rec = lstMarks.SelectedItem.ToString();
s_rec_arr = ModuleData.s_rec.Split(':');
ModuleData.s_id = s_rec_arr[0];
ModuleData.s_mark = s_rec_arr[1];
editMark myEditRecordForm = new editMark();
this.Hide();
myEditRecordForm.ShowDialog();
}
}
Редактировать форму:
public partial class editMark : Form {
public editMark() {
InitializeComponent();
StartPosition = FormStartPosition.CenterScreen;
txtStudentID.Focus();
}
private void btnSubmit_Click(object sender, EventArgs e) {
}
private void btnClose_Click(object sender, EventArgs e) {
this.Hide();
Form1 myForm = new Form1();
myForm.ShowDialog();
}
private void editMark_Load(object sender, EventArgs e) {
txtStudentID.Text = ModuleData.s_id;
txtMark.Text = ModuleData.s_mark;
}
}
Ответ №1:
Вы можете добавить любой тип объекта в поле списка, а не только строки. Создайте класс student и добавьте Student
объекты в поле listbox. Или, может быть, вы предпочитаете использовать свой ModuleData
класс. Но в любом случае вам не нужно использовать s_rec
строку, разделенную двоеточием.
public class Student
{
public string Id { get; set; }
public string Mark { get; set; }
// Required to make to have the list box display useful information about students.
public override string ToString()
{
return $"Id = {Id}, Mark = {Mark}";
}
}
Теперь добавьте параметр в конструктор формы редактирования, чтобы иметь возможность передавать учащегося
private Student _student;
public editMark(Student student)
{
InitializeComponent();
// Remember the student
_student = student;
StartPosition = FormStartPosition.CenterScreen;
txtStudentID.Text = student.Id;
txtMark.Text = student.Mark;
txtStudentID.Focus();
}
В editform, если вы это сделаете Form1 myForm = new Form1();
, это создаст новый экземпляр Form1
вместо использования существующего скрытого экземпляра.
Помните, что класс является ссылочным типом, поэтому нет необходимости передавать student обратно в первую форму, потому что в этой форме также есть ссылка на того же студента. Обновляйте только его свойства
private void btnClose_Click(object sender, EventArgs e)
{
_student.Id = txtStudentID.Text; // Only id the Id is editable.
_student.Mark = txtMark.Text;
Close();
}
В основной форме
private void BtnEditMark_Click(object sender, EventArgs e)
{
if (lstMarks.SelectedIndex == -1) {
MessageBox.Show("please select a student");
} else {
var student = (Student)lstMarks.SelectedItem;
// Pass the student as to the edit form
var myEditRecordForm = new editMark(student);
Hide();
myEditRecordForm.ShowDialog(); // The code pauses here until the edit form is closed.
Show(); // Doing this here prevents you from having the edit form knowing about Form1.
// To display the changes.
lstMarks.Items[lstMarks.SelectedIndex] = student;
}
}
Комментарии:
1. Привет, Ойлвер, большое спасибо за ответ на мой вопрос! Ваше решение, похоже, имеет гораздо больше смысла, хотя код выполняется, у него возникают проблемы с: var student = (Student)lstMarks. Выбранный элемент; строка. Когда я запускаю свою программу, я должен сначала выбрать метку в списке, а затем нажать Редактировать, когда я это делаю, она вылетает из-за этой строки кода
2. Конечно, вам нужно добавить элементы типа
Student
в поле списка. Например:lstMarks.Items.Add(new Student { Id = "1", Mark = "A" });
. НетToString()
! Я не знаю, как вы это сделали. Если вы назначилиDataSource
, то вы должны назначить ему коллекцию типаStudent
.3. я прочитал идентификаторы учащихся и оценки из текстового файла. Я действительно не понимаю, как решить эту проблему, когда вы говорите lstmark.item.add(новый студент .. я не знаю, куда его поместить! действительно извините за то, что я здесь придурок, я действительно благодарен за вашу помощь!
4. Предполагая, что каждая строка файла содержит одну запись студента, затем преобразуйте каждую строку в студента (используя разделение, как и раньше) и сохраните их в
List<Student>()
.var studentList = new List<Student>();
Что-то вроде этогоstring[] rec = line.Split(";"); studentList.Add(new Student { Id = rec[0], Mark = rec[1] });
.