【问题标题】:How pass a value to user control from a winform?如何将值从 winform 传递给用户控件?
【发布时间】:2019-03-26 14:02:09
【问题描述】:

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

【问题讨论】:

  • 你有一个 SQL 注入漏洞。
  • 在编写另一行代码之前,您需要阅读有关 sql 注入的内容。您的代码是开放的。我的朋友Bobbly Tables 喜欢这种东西。您还需要将命令和连接对象(以及任何其他实现 IDisposable 的对象)包装在 USING 语句中。当多人使用此应用程序时,您在此处的代码会占用您的连接池。
  • 谢谢您的帮助!
  • 添加了参数+更好的构造函数+正确处理的答案。我鼓励阅读 a) SQL 注入。 b) 非托管资源(IDisposable)
  • 您可能希望将 SELECT email FROM ... 更改为 SELECT userName FROM ...

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您应该使用参数化查询并正确使用非托管资源。 IDisposable 的一个简单快捷的技巧是using keyword

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

      }

      【讨论】:

      • 谢谢,程序现在没有收到错误信息,但是现在在 labelWelcome 中不显示数据。它显示基本标签文本,而不是数据库的数据。
      • 你的代码执行了吗?检查using a debugger
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多