2016-11-20 3 views
0

Ich habe ein Benutzersteuerelement mit 10 kleinen Tasten (20 x 20). Ich verwende den folgenden Code, damit der Benutzer jede Schaltfläche nur entlang der X-Achse ziehen kann. Ich möchte dann seine X-Position in einer Liste speichern, die als Teil einer XML-Datei gespeichert werden kann und dann mit den gleichen Schaltflächenstandorten geladen wird, wenn die App das nächste Mal ausgeführt wird. Aus irgendeinem Grund kann ich den Speicherort der Schaltfläche nicht speichern. Sogar das Meldungsfeld wird nicht angezeigt. Was mache ich falsch?Kann Button Position in XML-Datei nicht speichern

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

Sie müssen zwei separate Fragen stellen. Erstens über das Bewegen von Buttons, zweitens über das Speichern/Laden von Daten nach/von xml. –

+0

Sorry, ich war nicht klar. Die Tasten bewegen sich gut. Ich kann die Standorte nicht speichern. –

+0

Nun, zeigen Sie Ihren Sicherungscode. –

Antwort

0

Um Schaltflächen zu verschieben, verwenden Sie den folgenden Code. Abonnieren Sie jede Schaltfläche in diesem Ereignishandler.

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

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

Das Ereignis MouseDown ist nicht erforderlich.

Speichern Sie keine Daten in XML mit jeder Mausbewegung, weil es sehr ineffizient ist.

Tun Sie dies zum Beispiel, wenn das Formular geschlossen ist. Und lesen Sie die Daten, wenn das Formular geladen wird.

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

Hat gut funktioniert, nachdem ich es in einen MouseUp-Handler geändert habe. Frage. Ist es möglich, den Mauszeiger zu ziehen, ohne das Click-Ereignis auszulösen oder mit der rechten Maustaste zu ziehen, ohne ein Kontextmenü-Ereignis auszulösen? –

Verwandte Themen