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
字段。
还有一个建议,在检查你的代码时,Form2
在 while-loop
里面(在数据收集期间),你可以做的是先收集所有数据并将其放在 members
集合,那么你可以通过将整个集合传递给 Form2
来将每个 member
显示到表单中,或者如果你想传递每个成员,你可以在收集所有数据(收集期间没有).
作为伪代码:
Collect each Member
-> Add to Members Collection
- 使用
Form2
通过将 Member
传递给它来显示每个 Member
或将所有 Members Collection
传递给 Form2
然后遍历每个成员Next
或 Previous
按钮
我有一个问题,当从我的 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
字段。
还有一个建议,在检查你的代码时,Form2
在 while-loop
里面(在数据收集期间),你可以做的是先收集所有数据并将其放在 members
集合,那么你可以通过将整个集合传递给 Form2
来将每个 member
显示到表单中,或者如果你想传递每个成员,你可以在收集所有数据(收集期间没有).
作为伪代码:
Collect each Member
->Add to Members Collection
- 使用
Form2
通过将Member
传递给它来显示每个Member
或将所有Members Collection
传递给Form2
然后遍历每个成员Next
或Previous
按钮