[英]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 ). 还有一个建议,在检查代码时,
Form2
在while-loop
(在数据收集期间),您可以做的就是首先收集所有数据并将其放入members
集合中,然后可以在表单中显示每个member
通过将整个集合传递给Form2
或者如果您希望将每个成员传递给您,则可以在收集所有数据之后( 而不是在收集期间 )进行传递。
As a pseudocode: 作为伪代码:
Collect each Member
-> Add to Members Collection
Collect each Member
-> Add to Members Collection
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.