首页 > 解决方案 > 从第二个表单访问列表并将用户输入添加到列表中

问题描述

我有一个名为“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 和数据将在列表框中。

标签: c#

解决方案


好的,在 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;
    }

}

推荐阅读