c# - 从第二个表单访问列表并将用户输入添加到列表中
问题描述
我有一个名为“studentInfo”的列表,我试图让用户转到我创建的名为“addRecord”的表单并输入学生代码和学生标记,一旦他们点击提交,数据就会添加到列表中在 form1 中,然后数据也被添加到 form1 中的列表框中。
我不知道该怎么做,因为我是 C# 新手,所以任何指导都将不胜感激。
我的列表是这样创建的
public static List<string> studentInfo = new List<string>();
然后,一旦我的 form1 加载,我从 CSV 文件中读取以填充列表框
private void Form1_Load(object sender, EventArgs e)
{
string lines, studentNumber, studentMark;
StreamReader inputFile;
inputFile = File.OpenText("COM122.csv");
while (!inputFile.EndOfStream)
{
lines = inputFile.ReadLine();
studentInfo = lines.Split(',').ToList();
studentNumber = studentInfo[0];
studentMark = studentInfo[1];
lstMarks.Items.Add(studentNumber + " : " + studentMark);
}
inputFile.Close();
}
我希望用户转到 addRecord 表单,输入学生代码和学生标记,然后点击提交,然后程序要求用户确认他们输入的数据是正确的,然后用户被引导回 form1 和数据将在列表框中。
解决方案
好的,在 Form addRecord 中,我们创建了两个属性来保存要从主 Form 中检索的数据。仅当 addRecord 返回 DialogResult.OK 时才应该这样做。我添加了两个按钮,一个用于取消,一个用于确定。这些只是将 DialogResult 设置为它们各自的结果。要返回的两个值的属性值也在 OK 按钮处理程序中设置:
public partial class addRecord : Form
{
public addRecord()
{
InitializeComponent();
}
private string _Student;
public string Student
{
get
{
return this._Student;
}
}
private string _Score;
public string Score
{
get
{
return this._Score;
}
}
private void btnOK_Click(object sender, EventArgs e)
{
this._Student = this.tbStudent.Text;
this._Score = this.tbScore.Text;
this.DialogResult = DialogResult.OK;
}
private void btnCancel_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
}
}
现在,回到 Form1,这是一个使用 ShowDialog() 显示 addRecord 的示例,然后在返回 OK 时检索存储的值:
public partial class Form1 : Form
{
public static List<string> studentInfo = new List<string>();
// ... other code ...
private void btnAddRecord_Click(object sender, EventArgs e)
{
addRecord frmAddRecord = new addRecord();
if (frmAddRecord.ShowDialog() == DialogResult.OK)
{
studentInfo.Add(frmAddRecord.Student);
studentInfo.Add(frmAddRecord.Score);
lstMarks.Items.Add(frmAddRecord.Student + " : " + frmAddRecord.Score);
}
}
}
- - 编辑 - -
这是 addRecord 的另一个版本,在输入有效名称和有效分数之前,您不能点击 OK。请注意,该属性已更改为 int,并且 TextChanged() 事件已连接到 ValidateFields()。OK 按钮最初也被禁用:
public partial class addRecord : Form
{
public addRecord()
{
InitializeComponent();
this.tbStudent.TextChanged += ValidateFields;
this.tbScore.TextChanged += ValidateFields;
btnOK.Enabled = false;
}
private string _Student;
public string Student
{
get
{
return this._Student;
}
}
private int _Score;
public int Score
{
get
{
return this._Score;
}
}
private void ValidateFields(object sender, EventArgs e)
{
bool valid = false; // assume invalid until proven otherwise
// Make sure we have a non-blank name, and a valid mark between 0 and 100:
if (this.tbStudent.Text.Trim().Length > 0)
{
int mark;
if (int.TryParse(this.tbScore.Text, out mark))
{
if (mark >= 0 && mark <= 100)
{
this._Student = this.tbStudent.Text.Trim();
this._Score = mark;
valid = true; // it's all good!
}
}
}
this.btnOK.Enabled = valid;
}
private void btnOK_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
}
private void btnCancel_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
}
}