我遇到一个问题,当在表单加载时访问和显示名为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;
所有标签只显示为空白。有什么想法吗?
答案 0 :(得分:0)
暂时忽略在网络数据库中存储明文密码的可疑逻辑......
在我看来,您未能将检索到的成员数据传递给您创建的Form2
实例,而是使用未初始化的 {{em>}实例初始化您的表单1}}。
如果没有可靠地再现问题的a good, minimal, complete code example,就无法确定正确的方法是什么。但从广义上讲,您应该将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
字段。
答案 1 :(得分:0)
另外作为建议,在检查代码时,Form2
位于while-loop
内(在数据收集期间),您可以做的是先收集所有数据并将其放入{{1然后,您可以通过将整个集合传递给members
来向表单显示每个member
,或者如果要传递每个成员,则可以在收集所有数据后执行此操作( not在收集期间)。
作为伪代码:
Form2
- &gt; Collect each Member
Add to Members Collection
通过将Form2
传递给Member
来显示每个Member
,或者将所有Members Collection
传递给Form2
,然后通过{{遍历每个成员1}}或Next
按钮