简体   繁体   English

C#从类访问变量

[英]C# Accessing variables from class

I have an issue that when accessing and displaying variables from my class named Members into labels upon form load the labels just display blank data. 我有一个问题,当在表单加载时从名为Members类中访问变量并在其中显示变量时,将这些标签显示为空白数据。

My program uses a login form to do this and this is when it gets and sets the members details into the class. 我的程序使用登录表单来执行此操作,这是在它获取并将成员详细信息设置到类中时执行的。 It uses the code below: 它使用以下代码:

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;
    }

This basically just checks the users name and password entries against the database data and if it is successful then it sets the name, password, member ID and course title into the variables stored in the class. 这基本上只是对照数据库数据检查用户名和密码条目,如果成功,则将名称,密码,成员ID和课程标题设置为存储在类中的变量。

However when I use this code under the form 2 load event 但是,当我在表单2加载事件下使用此代码时

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

All labels just appear blank. 所有标签仅显示为空白。 Any ideas? 有任何想法吗?

Ignoring for a moment the questionable logic of storing plaintext passwords in your database… 暂时忽略将明文密码存储在数据库中的可疑逻辑……

It seems to me that you are failing to pass the retrieved member data to the Form2 instance you've created, and instead are initializing your form using an uninitialized instance of Member . 在我看来,您无法将检索到的成员数据传递给您创建的Form2实例,而是使用未初始化Member实例初始化表单。

Without a good, minimal , complete code example that reliably reproduces the problem, it's not possible to say for sure what the correct approach would be. 没有可靠,可靠地重现问题的良好, 简短完整的代码示例 ,就无法确定将采用哪种正确方法。 But broadly, you should probably be passing the member reference from GetMembers() to the Form2 instance, eg to its constructor. 但是从广义上讲,您可能应该将member引用从GetMembers()传递给Form2实例,例如,传递给其构造函数。

That might look something like this: 可能看起来像这样:

Form2 frm2 = new Form2(member);

where: 哪里:

class Form2 : Form
{
    private readonly Member _member;

    public Form2(Member member)
    {
        InitializeComponent();
        _member = member;
    }
}

Then change your Load event code to look like this: 然后更改您的Load事件代码,如下所示:

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

Ie remove the local member variable altogether, and instead use the class's _member field. 即完全删除本地member变量,而使用类的_member字段。

Also as a suggestion, while checking your code, Form2 is inside the while-loop (during data collection), what you can do is collect first all the data and put it inside the members collection, then you can display each member to the form by passing the whole collection to Form2 or if you want to pass each member you can do it after collecting all the data ( not during the collection ). 还有一个建议,在检查代码时, Form2while-loop (在数据收集期间),您可以做的就是首先收集所有数据并将其放入members集合中,然后可以在表单中显示每个member通过将整个集合传递给Form2或者如果您希望将每个成员传递给您,则可以在收集所有数据之后( 而不是在收集期间 )进行传递。

As a pseudocode: 作为伪代码:

  • Collect each Member -> Add to Members Collection Collect each Member -> Add to Members Collection
  • Use Form2 to display each Member by passing the Member to it OR pass all the Members Collection to Form2 then traverse to each member via Next or Previous button 使用Form2通过将Member传递给每个Member来显示每个Member ,或者将所有Members Collection传递给Form2然后通过“ Next或“ Previous按钮遍历每个成员

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

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