2016-11-20 19 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事件的情況下進行左拖動,或者在沒有觸發上下文菜單事件的情況下進行右拖動? –