【问题标题】:Save location of multiple labels to SQL DB将多个标签的位置保存到 SQL DB
【发布时间】:2025-12-04 23:30:01
【问题描述】:

您好,这是 creates multiple labels 到保存在 SQL DB 中的确切位置的代码。现在我想知道如何保存每个标签的位置(因为我可以像Drag and drop 一样移动它们)。我想知道代码应该是什么样子,因为当我在运行时创建标签时,它没有名称,不是吗?我不确定它应该如何分配。

谁能帮我解决这个问题?

这是加载代码:

private void createLabelFromSql()
        {
            try
            {
                string query = "SELECT * FROM [schema] WHERE id=@id";
                SqlCommand com = new SqlCommand(query, conn);
                com.Parameters.AddWithValue("@id", idSch);
                conn.Open();
                SqlDataReader read= com.ExecuteReader();

                while (read.Read())
                {
                    mouseX = Int32.read(read["x"].ToString());
                    mouseY = Int32.read(read["y"].ToString());
                    createLabelCmd();

                }
                conn.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("" + ex);
            }
            finally { conn.Close(); }

        }
    private void createLabelCmd()
        {

                        newLabel = new Label();
                        newLabel.Location = new Point(mouseY, mouseX);
                        newLabel.MouseMove += new MouseEventHandler(this.MyControl_MouseMove);
                        newLabel.MouseDown += new MouseEventHandler(this.MyControl_MouseDown);
                        panel1.Controls.Add(newLabel);

        }

我认为它可能是这样的,但不确定如何处理名称:

            string query = "UPDATE [schema] SET x=@x, y=@y WHERE id=@id";
      SqlCommand cmd = new  SqlCommand(query, conn);
        cmd.Parameters.AddWithValue("@x",label1.Location.X);
        cmd.Parameters.AddWithValue("@y", label1.Location.Y);

      conn.Open();
      cmd.ExecuteNonQuery();
      conn.Close();

感谢您的宝贵时间。

【问题讨论】:

    标签: c# sql sql-server winforms


    【解决方案1】:

    我的方式:

     private void createLabelFromSql()
        {
            try
            {
                string query = "SELECT * FROM [schema] WHERE id=@id";
                SqlCommand com = new SqlCommand(query, spojeni);
                com.Parameters.AddWithValue("@id", idSch);
                spojeni.Open();
                SqlDataReader precti = com.ExecuteReader();
    
                while (precti.Read())
                {
                    createLabelCmd((int)precti["x"], (int)precti["y"]);
                }
                spojeni.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("" + ex);
            }
            finally { spojeni.Close(); }
        }
    
        private void createLabelCmd(int x, int y)
        {
            var newLabel = new Label();
            newLabel.Location = new Point(y, x);
            newLabel.Font = new Font(newLabel.Font.FontFamily.Name, 9, FontStyle.Bold);
            newLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
            newLabel.MouseMove += new MouseEventHandler(this.MyControl_MouseMove);
            newLabel.MouseDown += new MouseEventHandler(this.MyControl_MouseDown);
            panel1.Controls.Add(newLabel);
        }
    
        private void SaveAllLabels()
        {
            spojeni.Open();
    
            //delete all data
            SqlCommand delCmd = new SqlCommand("DELETE FROM  [schema] WHERE id=@id", spojeni);
            delCmd.Parameters.AddWithValue("@id", idSch);
            delCmd.ExecuteNonQuery();
    
            //create new data for current state
            string query = "INSERT INTO [schema] VALUES (@x, @y, @id)";
            SqlCommand cmd = new SqlCommand(query, spojeni);
            cmd.Parameters.Add("@x", SqlDbType.Int);
            cmd.Parameters.Add("@y", SqlDbType.Int);
            cmd.Parameters.AddWithValue("@id", idSch);
    
            foreach (Control item in panel1.Controls)
            {
                if (item is Label)
                {
                    cmd.Parameters["@x"].Value = item.Location.X;
                    cmd.Parameters["@y"].Value = item.Location.Y;
                    cmd.ExecuteNonQuery();
                }
            }
    
            spojeni.Close();
        }
    

    【讨论】:

      【解决方案2】:

      你为什么不给每个label一个名字?

      开斋节: 假设id 是表的Primary Key,您可以通过以下方式获取它:

      private void createLabelFromSql()
      {
      ....
      ....
       while (read.Read())
       {
           mouseX = Int32.read(read["x"].ToString());
           mouseY = Int32.read(read["y"].ToString());
           createLabelCmd(Int32.Parse(read["id"].ToString())); // you can extract the id here
       }
       conn.Close();
      }
      

      并将保存方法更改为:

       string query = "UPDATE [schema] SET x=@x, y=@y WHERE id=@id";
       SqlCommand cmd = new  SqlCommand(query, conn);
       cmd.Parameters.AddWithValue("@x",label1.Location.X);
       cmd.Parameters.AddWithValue("@y", label1.Location.Y);
       cmd.Parameters.AddWithValue("@id", int.Parse(label1.Name.Replace("lbl","")));
      ....
      

      编辑结束,

      private void createLabelCmd(int id)
      {
          newLabel = new Label();
          newLabel.Name = "lbl" + id.ToString();
          newLabel.Location = new Point(mouseY, mouseX);
      .....
      .....
      }
      

      【讨论】:

      • 给每个 lbl 命名可能很有用,然后我可能会将它分配到 for 循环中。
      • @Marek 我相信分配名称是解决方案。但是,我无法理解你的想法。使用 Name 属性有什么问题吗?
      • 我没有投反对票。请问有什么办法可以解决这个问题吗? cmd.Parameters.AddWithValue("@x", (label+i).Location.X); ?它在 for 循环中。
      • 我没有问题,但我不知道如何将新添加的名称绑定到 SqlCommand,感谢您的时间。