[英]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
字段。
还有一个建议,在检查代码时, Form2
在while-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.