В моей программе я разрешаю пользователю выбирать запись студента из списка, когда он нажимает кнопку редактирования, открывается новая форма. В этой форме отображаются идентификатор и оценка учащегося, которого они выбрали. Я должен позволить пользователю редактировать эту метку и обновлять список. У меня возникли проблемы с редактированием пользователем, и я был бы признателен за любые советы по этому поводу. (У меня проблемы с выяснением, что делать, когда у меня есть данные пользователя внутри формы редактирования)
Мне не разрешено использовать 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;
}
}
Вы можете добавить в список любой тип объекта, а не только строки. Создайте студенческий класс и добавьте Student
объектов в список. Или, может быть, вы предпочитаете использовать свой класс 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();
}
В форме редактирования, если вы сделаете Form1 myForm = new Form1();
, это создаст новый экземпляр Form1
вместо использования существующего скрытого.
Помните, что класс является ссылочным типом, поэтому нет необходимости передавать ученика обратно в первую форму, потому что в этом тоже есть ссылка на того же ученика. Обновите только его свойства
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;
}
}
Конечно, вы должны добавить элементы типа Student
в список. Например: lstMarks.Items.Add(new Student { Id = "1", Mark = "A" });
. Нет ToString()
! Я не знаю, как вы это сделали. Если вы присвоили DataSource
, то вы должны назначить ему коллекцию типа Student
.
я прочитал студенческие билеты и отметки из текстового файла. Я действительно запутался в том, как решить эту проблему, когда вы говорите lstmark.item.add (новый студент .. я не знаю, куда это поместить! Мне очень жаль, что я здесь, я действительно благодарен за вашу помощь!
Предполагая, что каждая строка файла содержит одну запись об ученике, затем преобразуйте каждую строку в запись об ученике (используя разделение, как и раньше) и сохраните их в файле List<Student>()
. var studentList = new List<Student>();
Примерно так string[] rec = line.Split(";"); studentList.Add(new Student { Id = rec[0], Mark = rec[1] });
.
Привет Oilver! Большое спасибо за ответ на мой вопрос! Ваше решение кажется более разумным. Хотя код работает, у него возникают проблемы с: var student = (Student)lstMarks.SelectedItem; линия. Когда я запускаю свою программу, мне нужно сначала выбрать метку в списке, а затем нажать «Изменить», когда я это делаю, она падает из-за этой строки кода.