如何通过Winform将值传递给用户控件?

时间:2019-03-26 14:02:10

标签: c# sql-server winforms user-controls

我有一个注册表格,一个登录表格和一个Main表格。程序以注册表格开头。如果我注册数据(名称,电子邮件,密码),请加载到本地数据库。当我正确登录时,显示主要表格。主窗体具有带标签的用户控件。我想在标签上写上他/他的名字的欢迎文字。示例:“欢迎乔什!”。所以我应该识别用户,因此我使用登录表单中的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 =新的personalFinance.Homepage1();用红色下划线。

3 个答案:

答案 0 :(得分:0)

WinForms设计器通过调用默认控件来创建用户控件。因此,您不能定义这样的自定义构造函数。

相反,您应该创建一个自定义属性。

答案 1 :(得分:0)

电子邮件字段是否唯一?你已经调试了吗?是否发生任何错误? 该查询可能带来了多个记录或没有记录,并且该字段也为空。试试这个:

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;
                }
            }           
        }
    }
}

答案 2 :(得分:0)

您应该使用参数化查询并正确使用非托管资源。 using keyword

是实现IDisposable的简便方法
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();
      }
 }

}