C#访问类中的变量

本文关键字:变量 访问 | 更新日期: 2023-09-27 18:06:06

我遇到一个问题,当在表单加载时访问名为Members的类中的变量并将其显示到标签中时,标签只显示空白数据。

我的程序使用登录表单来完成这项工作,这是它获取并设置类中成员详细信息的时候。它使用以下代码:

public class Member
{
   public int MemberID { get; set; }
   public string Name { get; set; }
   public string Surname { get; set; }
   public string CourseTitle { get; set; }
   public string Password { get; set; }
}
    private IList<Member> GetMembers()
    {
        OleDbConnection conn = null;
        OleDbDataReader reader = null;
        try
        {
            conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:'Users'Rhys'Documents'Visual Studio 2013'Projects'AssignmentTrackerV2'AssignmentTrackerV2'bin'Debug'ATDatabase.accdb");
            conn.Open();
            OleDbCommand cmd = new OleDbCommand("SELECT * FROM MemberDetails WHERE [Name] = @Name AND [Password] = @Password", conn);
            cmd.Parameters.AddWithValue("@Name", txtFirstNameLogin.Text);
            cmd.Parameters.AddWithValue("@Password", txtPasswordLogin.Text);
            reader = cmd.ExecuteReader();
            var members = new List<Member>();
            while (reader.Read())
            {
                var member = new Member();
                member.MemberID = reader.GetInt32(reader.GetOrdinal("MemberID"));
                member.Name = reader["Name"].ToString();
                member.Surname = reader["Surname"].ToString();
                member.CourseTitle = reader["CourseTitle"].ToString();
                members.Add(member);
                Form2 frm2 = new Form2();
                this.Hide();
                frm2.ShowDialog();
            }
            return members;
        }
        finally
        {
            if (reader != null) reader.Close();
            if (conn != null) conn.Close();
        }
        return null;
    }

这基本上只是根据数据库数据检查用户名和密码条目,如果成功,则将名称、密码、成员ID和课程标题设置到类中存储的变量中。

然而,当我在表单2加载事件下使用此代码时

var member = new Member();
lblName.Text = member.Name;
lblSurname.Text = member.Surname;
lblCourseTitle.Text = member.CourseTitle;

所有标签都显示为空白。有什么想法吗?

C#访问类中的变量

暂时忽略在数据库中存储明文密码的可疑逻辑…

在我看来,您似乎没有将检索到的成员数据传递给您创建的Form2实例,而是使用Member未初始化实例初始化表单。

如果没有一个可靠地再现问题的好的、最小的complete代码示例,就不可能确定正确的方法是什么。但从广义上讲,您可能应该将member引用从GetMembers()传递到Form2实例,例如传递到其构造函数。

这可能看起来像这样:

Form2 frm2 = new Form2(member);

其中:

class Form2 : Form
{
    private readonly Member _member;
    public Form2(Member member)
    {
        InitializeComponent();
        _member = member;
    }
}

然后将Load事件代码更改为如下所示:

lblName.Text = _member.Name;
lblSurname.Text = _member.Surname;
lblCourseTitle.Text = _member.CourseTitle;

即,完全删除本地member变量,而使用类的_member字段。

另外,建议在检查代码时,Form2while-loop内部(在数据收集过程中(,您可以先收集所有数据,然后将其放入members集合中,然后您可以通过将整个集合传递给Form2来将每个member显示到表单中,或者如果您想传递每个成员,则可以在收集所有数据后进行(而不是在收集期间(。

作为伪代码:

  • Collect each Member->Add to Members Collection
  • 使用Form2通过将Member传递给它来显示每个Member,或者将所有Members Collection传递给Form2,然后通过NextPrevious按钮遍历到每个成员