簡體   English   中英

C#從類訪問變量

[英]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字段。

還有一個建議,在檢查代碼時, Form2while-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM