繁体   English   中英

C#从类访问变量

[英]C# Accessing variables from class

我有一个问题,当在表单加载时从名为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;

所有标签仅显示为空白。 有任何想法吗?

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

在我看来,您无法将检索到的成员数据传递给您创建的Form2实例,而是使用未初始化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变量,而使用类的_member字段。

还有一个建议,在检查代码时, Form2while-loop (在数据收集期间),您可以做的就是首先收集所有数据并将其放入members集合中,然后可以在表单中显示每个member通过将整个集合传递给Form2或者如果您希望将每个成员传递给您,则可以在收集所有数据之后( 而不是在收集期间 )进行传递。

作为伪代码:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM