【问题标题】:Populating a listbox in one form with a class containing the values on another form使用包含另一个表单上的值的类填充一个表单中的列表框
【发布时间】:2014-06-18 14:58:11
【问题描述】:

我是编程新手,尝试在表单之间发送信息时遇到了很多麻烦。

我现在的情况:

我有 2 个表格和一个班级。我的第一个表单只包含一个列表框,而我的第二个表单包含几个带有确定按钮的文本框。我想要做的是在form2 的文本框中输入信息,点击确定,然后让每个文本框中的所有信息都填充到我的form1 的列表框中。来自 form2 的信息应该都在 form1 的列表框中的一行。

现在我要做的是将form2 的文本框中的信息添加到我的自定义类中,然后将该自定义类传递给form1 中的列表框。我将不胜感激任何帮助。这是我到目前为止的代码:

表格2:

public partial class frmProperties : Form
{
    private string empVar;

    public string EmployeeNew
    {
        get { return empVar; }
        set { empVar = value; }
    }

    public frmProperties()
    {
        InitializeComponent();
    }

    private void btnCancel_Click(object sender, EventArgs e)
    {
        Close();
    }

    private void btnOk_Click(object sender, EventArgs e)
    {
        string empVar;
        double salaryToDouble = Convert.ToDouble(txtSalary.Text);
        Employee testEmploy = new Employee(txtFirstName.Text, txtLastName.Text, txtEmpType.Text, salaryToDouble);
        empVar = Convert.ToString(testEmploy);
    }
}

表格1:

public partial class Form1 : Form
{
    //public vars for file access
    FileStream output;
    StreamReader fileReader;
    StreamWriter fileWriter;

    public Form1()
    {
        InitializeComponent();
    }

    private void openToolStripMenuItem_Click(object sender, EventArgs e)
    {
        OpenFileDialog fileChooser = new OpenFileDialog();

        fileChooser.Title = "Choose an employee file to open";
        fileChooser.Filter = "Text Files (*.txt)|*.txt";

        DialogResult result = fileChooser.ShowDialog();

        //if cancel
        if (result == DialogResult.Cancel)
        {
            return;
        }

        string strFileName = fileChooser.FileName;

        try
        {
            //open file for read access
            output = new FileStream(strFileName, FileMode.Open, FileAccess.Read);

            fileReader = new StreamReader(output);

            //var to hold the read record
            string strInputLine;
            string[] fields;

            //loop to get records and break into fields
            while (fileReader.EndOfStream != true)
            {
                //read record
                strInputLine = fileReader.ReadLine();

                //split the record
                fields = strInputLine.Split(',');

                //Check for empty space
                if (!string.IsNullOrEmpty(strInputLine))
                {
                    double salaryToDouble = Convert.ToDouble(fields[3]);
                    lstBoxEmployees.Items.Add(new Employee(fields[0], fields[1], fields[2], salaryToDouble));
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            //close resources
            fileReader.Close();
            output.Close();
        }
    }

    private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
    {
        //create dialog
        SaveFileDialog fileChooser = new SaveFileDialog();

        fileChooser.Title = "Choose a Save Location";
        fileChooser.Filter = "Text Files (*.txt)|*.txt";

        //open dialog, get result
        DialogResult result = fileChooser.ShowDialog();

        //if cancel
        if (result == DialogResult.Cancel)
        {
            return;
        }

        //get file name from dialog
        string strFileName = fileChooser.FileName;

        try
        {
            //save via filestream
            //open the new file for write access
            output = new FileStream(strFileName, FileMode.OpenOrCreate, FileAccess.Write);

            fileWriter = new StreamWriter(output);

            //take the text from listbox and write it to a file
            fileWriter.WriteLine(lstBoxEmployees);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            //close resources
            fileWriter.Close();
            output.Close();
        }
    }

    private void addNewToolStripMenuItem_Click(object sender, EventArgs e)
    {
        MenuOpen();
    }

    //Properties form method.
    private void MenuOpen()
    {
        frmProperties newEmployee = new frmProperties();
        DialogResult result = newEmployee.ShowDialog();

        if (newEmployee.ShowDialog() == DialogResult.OK)
        {
            lstBoxEmployees.Items.Add(newEmployee.EmployeeNew);
        }
    }

    private void toolStripButton1_Click(object sender, EventArgs e)
    {
        MenuOpen();
    }

    private void lstBoxEmployees_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        if (lstBoxEmployees.SelectedItem != null)
            if (lstBoxEmployees.SelectedItem.ToString().Length != 0)
                MenuOpen();
    }

    private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
    {
        object toRemove = lstBoxEmployees.SelectedItem;
        lstBoxEmployees.Items.Remove(toRemove);
    }
}

自定义类:

class Employee
{
    private string firstName;
    private string lastName;
    private string empType;
    private double salary;

    //Constructor
    public Employee(string FirstName, string LastName, string EmpType, double Salary)
    {
        firstName = FirstName;
        lastName = LastName;
        empType = EmpType;
        salary = Salary;
    }

    public string EmployeeFirstName
    {
        get { return firstName; }
        set { firstName = value; }
    }

    public string EmployeeLastName
    {
        get { return lastName; }
        set { lastName = value; }
    }

    public string EmploymentType
    {
        get { return empType; }
        set { empType = value; }
    }

    public double EmployeeSalary
    {
        get { return salary; }
        set { salary = value; }
    }

    public override string ToString()
    {
        return (firstName + ", " + lastName);
    }
}

【问题讨论】:

    标签: c# wpf winforms reference listbox


    【解决方案1】:

    您的代码中存在许多问题。

    1. 在您的 Form2 中,您的 btnOk_Click 方法将新员工详细信息放入 local 变量(也称为 empVar),而不是类变量。要解决此问题,请从 btnOk_Click 方法中删除行 string empVar;

    2. 您的lstBoxEmployees 假设添加Employee 类型的项目,而不是string。所以你的EmployeeNewempVar 应该改成Employee 而不是string。并且您的btnOk_Click 方法应更改为将新员工直接分配给empVar,如下所示:

      empVar = testEmploy;
      
    3. 您的Employee 类需要公开,如:

      public class Employee
      
    4. 确保您的“确定”和“取消”按钮在表单设计器中分别将其DialogResult 设置为“确定”和“取消”。

    5. 如果上述步骤 4 正确完成,则不需要在取消按钮事件处理程序中使用 Close(); 语句。

    【讨论】:

    • 谢谢,我在那里学到了一些新东西。出于某种原因,我现在收到此错误:错误 1 ​​可访问性不一致:属性类型“Employees.Employee”比属性“Employees.frmProperties.EmployeeNew”PropertiesForm.cs 第 17 行更难访问
    • 解决了这个错误,谢谢。由于某种原因,当我运行程序并单击“确定”按钮时,它仍然不会将值添加到 form1 的列表框中。
    • 我怀疑您的“确定”和“取消”按钮在设计器中设置不正确。我已经更新了上面的答案来帮助你。
    • 只是好奇,您是否使用 Visual Studio 编写代码?使用 Visual Studio 中的调试器可以轻松识别其中的许多问题。
    • 是的,我使用的是 Visual Studio 2012。
    猜你喜欢
    • 2015-08-24
    • 2020-10-29
    • 2023-03-21
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多