[英]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.