2016-11-20 18 views
0

我有一个带10个小按钮(20 x 20)的用户控件。我正在使用以下代码来允许用户只沿x轴拖动每个按钮。 然后我想将它的X位置保存到一个列表中,该列表可以保存为XML文件的一部分,然后在下次运行应用程序时加载相同的按钮位置。出于某种原因,我无法保存按钮位置。即使消息框不显示。我究竟做错了什么?无法将按钮位置保存在XML文件中

private Point p; 

    private void button2_mousedown(object sender, MouseEventArgs e) 
    { 
     string buttonName = ((Button)sender).Name; 
     Button b1 = ((Button)sender); 
     if (e.Button == MouseButtons.Left) 
     { 
      p = e.Location; 
     } 
    } 

    private void button2_mousemove(object sender, MouseEventArgs e) 
    { 
     string buttonName = ((Button)sender).Name; 
     Button b1 = ((Button)sender); 
     if (e.Button == MouseButtons.Left) 
     { 
      b1.Left = e.X + b1.Left - p.X; 
     } 
     int idx = int.Parse(buttonName) - 1; 
     scriptIconLocation[idx] = b1.Left; 
     //MessageBox.Show(scriptIconLocation[idx].ToString(), "saved location"); 
     savedSettings.ScriptIconLocation = scriptIconLocation; 
     saveSettingsXML(savedSettings); 
    } 
+0

您必须提出两个不同的问题。首先关于按钮的移动,其次是关于从xml保存/加载数据。 –

+0

对不起,我不清楚。按钮移动得很好。我无法保存位置。 –

+0

那么,显示你的保存代码。 –

回答

0

要移动按钮,请使用以下代码。订阅此事件处理程序上的每个按钮。

private void Button_MouseMove(object sender, MouseEventArgs e) 
{ 
    var button = (Button)sender; 

    if (e.Button == MouseButtons.Left) 
    { 
     button.Left = PointToClient(Cursor.Position).X; 
    } 
} 

MouseDown事件没有必要。


不要用鼠标每移动保存XML数据,因为它是非常低效的。

这样做,例如,当表单关闭时。并在表单加载时读取数据。

private void Form1_Load(object sender, EventArgs e) 
{ 
    // Array of your buttons. 
    var buttons = userControl.Controls.OfType<Button>().ToArray(); 

    var xml = XElement.Load("buttons.xml").Elements("X").ToArray(); 

    for (int i = 0; i < buttons.Length; i++) 
    { 
     buttons[i].Left = (int)xml[i]; 
    } 
} 

private void Form1_FormClosed(object sender, FormClosedEventArgs e) 
{ 
    var buttons = userControl.Controls.OfType<Button>(); 

    var xml = new XElement("Buttons", 
     buttons.Select(b => new XElement("X", b.Left))); 

    xml.Save("buttons.xml"); 
} 
+0

一旦我将其更改为MouseUp处理程序,就可以正常工作。题。是否可以在不触发Click事件的情况下进行左拖动,或者在没有触发上下文菜单事件的情况下进行右拖动? –