簡體   English   中英

如何從winform中將值傳遞給用戶控件?

[英]How pass a value to user control from a winform?

我有一個注冊表,一個登錄表和一個主表。該程序從注冊表開始。 如果我注冊數據(名稱,電子郵件,密碼)加載到本地數據庫。 當我正確登錄顯示主窗體。 主窗體具有帶標簽的usercontrol。 我想用她/他的名字在標簽上寫一個歡迎文本。 示例:“歡迎Josh!”。 所以我應該識別用戶,所以我使用登錄表單中的textboxEmail.Text。 我的解決方案不起作用。 有我的代碼:

namespace personalFinance
{
   public partial class Login : Form
      {
        public Login()
         {

            InitializeComponent();
            var MainForm = new MainForm();
            MainForm.Show();
            HomepageUC hp = new HomepageUC(textboxEmail.Text);
            hp.Show();
         } 
      }

}
namespace personalFinance
{
    public partial class HomepageUC : UserControl
    {
       string login = "";
       public HomepageUC(string email)
          {

            InitializeComponent();
            login = email;
            var conn = new SqlConnection(@"Server=(localdb)\MSSQLLocalDB; 
            AttachDbFileName=|DataDirectory|database.mdf;");
            conn.Open();
            var cmd = new SqlCommand($"SELECT email FROM registration_data 
            WHERE email = '{login}'", conn);
            var reader = cmd.ExecuteReader();
            while (reader.Read()) labelWelcome.Text = reader[0].ToString();
          }
     }

 }

我得到了這個錯誤:沒有給出的參數對應於'HomepageUC.HomepageUC(string)'personalFinance C:\\ Users \\ nickname18 \\ source \\ repos \\ personalFinance \\ personalFinance \\ MainForm.Designer.cs所需的形式參數'email'

當我點擊此錯誤檢索到MainForm.Designer.cs this.HompageUC1 = new personalFinance.Homepage1(); 它是紅色的下划線。

WinForms設計器通過調用其默認構造函數來創建用戶控件。 因此,您無法定義這樣的自定義構造函數。

相反,您應該創建一個自定義屬性。

電子郵件字段是唯一的嗎? 你有調試嗎? 發生任何錯誤? 也許查詢帶來了多條記錄或沒有記錄,也許該字段也是空的。 嘗試這個:

namespace personalFinance
{
    public partial class HomepageUC : UserControl
    {
       string login = "";
       public HomepageUC(string email)
          {

            InitializeComponent();
            login = email;
            var conn = new SqlConnection(@"Server=(localdb)\MSSQLLocalDB; 
            AttachDbFileName=|DataDirectory|database.mdf;");
            conn.Open();
            var cmd = new SqlCommand($"SELECT email FROM registration_data 
            WHERE email = '{login}'", conn);
            var reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                if(!string.IsNullOrEmpty(reader[0].ToString()))
                {
                    labelWelcome.Text = reader[0].ToString();
                    break;
                }
            }           
        }
    }
}

您應該使用參數化查詢並正確使用非托管資源。 IDisposable的一個簡單快捷的技巧是using關鍵字

public partial class HomepageUC : UserControl
{
   string login = "";

   public HomepageUC() // Default constructor for the designer/properties inicialization
   {
       InitializeComponent();
   }

   public HomepageUC(string email): this() // Your business logic constructor calls the default one
      {

        login = email;
        var conn = new SqlConnection(@"Server=(localdb)\MSSQLLocalDB; 
        AttachDbFileName=|DataDirectory|database.mdf;");
        conn.Open();
        var cmd = new SqlCommand($"SELECT email FROM registration_data WHERE email = @email", conn);
        cmd.Parameters.AddWithValue("@email", email); // Use parameters to avoid SQLi 
        var reader = cmd.ExecuteReader();
        while (reader.Read()) labelWelcome.Text = reader[0].ToString();
        conn.Close(); // Added unmanaged resources liberation
        conn.Dispose();
      }
 }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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