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;
所有标签都显示为空白。有什么想法吗?
暂时忽略在数据库中存储明文密码的可疑逻辑…
在我看来,您似乎没有将检索到的成员数据传递给您创建的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
字段。
另外,建议在检查代码时,Form2
在while-loop
内部(在数据收集过程中(,您可以先收集所有数据,然后将其放入members
集合中,然后您可以通过将整个集合传递给Form2
来将每个member
显示到表单中,或者如果您想传递每个成员,则可以在收集所有数据后进行(而不是在收集期间(。
作为伪代码:
Collect each Member
->Add to Members Collection
- 使用
Form2
通过将Member
传递给它来显示每个Member
,或者将所有Members Collection
传递给Form2
,然后通过Next
或Previous
按钮遍历到每个成员