C#从类中访问变量

时间:2015-08-04 00:53:23

标签: c# winforms ms-access login

我遇到一个问题,当在表单加载时访问和显示名为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;

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

2 个答案:

答案 0 :(得分:0)

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

在我看来,您未能将检索到的成员数据传递给您创建的Form2实例,而是使用未初始化的 {{em>}实例初始化您的表单1}}。

如果没有可靠地再现问题的a good, minimal, complete code example,就无法确定正确的方法是什么。但从广义上讲,您应该将Member引用从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字段。

答案 1 :(得分:0)

另外作为建议,在检查代码时,Form2位于while-loop内(在数据收集期间),您可以做的是先收集所有数据并将其放入{{1然后,您可以通过将整个集合传递给members来向表单显示每个member,或者如果要传递每个成员,则可以在收集所有数据后执行此操作( not在收集期间)。

作为伪代码:

  • Form2 - &gt; Collect each Member
  • 使用Add to Members Collection通过将Form2传递给Member来显示每个Member,或者将所有Members Collection传递给Form2,然后通过{{遍历每个成员1}}或Next按钮