C# 从 class 访问变量

C# Accessing variables from class

我有一个问题,当从我的 class 命名为 Members 的变量中访问和显示变量时,在表单加载时标签只显示空白数据。

我的程序使用登录表单来执行此操作,这是它获取成员详细信息并将其设置到 class 中的时间。它使用以下代码:

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 和课程标题设置到存储在 class 中的变量中。 =14=]

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

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

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

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

在我看来,您未能将检索到的成员数据传递给您创建的 Form2 实例,而是使用 uninitialized[=37= 初始化您的表单] Member.

的实例

如果 a good, minimal, complete code example 无法可靠地重现问题,则无法确定正确的方法是什么。但从广义上讲,您可能应该将 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 变量,而是使用 class 的 _member 字段。

还有一个建议,在检查你的代码时,Form2while-loop 里面(在数据收集期间),你可以做的是先收集所有数据并将其放在 members 集合,那么你可以通过将整个集合传递给 Form2 来将每个 member 显示到表单中,或者如果你想传递每个成员,你可以在收集所有数据(收集期间没有).

作为伪代码:

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