2009-07-13 3 views
3

Ich habe eine ContextMenuStrip, die Elemente anzeigt, die vom Benutzer benannt werden können; Der Benutzer darf den Artikeln Namen geben, die kaufmännische Und-Zeichen enthalten. Wenn die ContextMenuStrip angezeigt wird, behandeln die Elemente die Et-Zeichen als Escape-Sequenzen und unterstreichen das nächste Zeichen.Wie kann ich Elemente in einem ContextMenuStrip davon abhalten, speziell kaufmännische Und-Zeichen zu behandeln?

Ich könnte alle Et-Zeichen verdoppeln, bevor ich die Elemente Text Mitglieder, aber dieses Mitglied wird an anderer Stelle im Code verwendet, wenn möglich, würde ich gerne die ContextMenuStrip von der Behandlung von Ampersands speziell stoppen. Gibt es eine Möglichkeit, dieses Verhalten auszuschalten?

Antwort

9

Verwendung && eine einzige &

bearbeiten anzuzeigen: Leider verpasste ich den zweiten Teil Ihrer Frage :(

Sie immer string.Replace("&", "&&") auf den Text verwenden können, wenn Sie es einrichten, aber das scheint unordentlich

Eine andere Alternative wäre, von ToolStripMenuItem zu erben und den Satz der Texteigenschaft zu überschreiben, & durch && zu ersetzen tle besser, als es den Code an einmal Platz halten würde.

+0

Ich könnte alle Et-Zeichen verdoppeln, bevor ich die Text-Elemente der Elemente festlegen, aber dieses Member wird an anderer Stelle im Code verwendet. Wenn möglich, möchte ich ContextMenuStrip davon abhalten, speziell kaufmännische Und-Zeichen zu behandeln. Gibt es eine Möglichkeit, dieses Verhalten auszuschalten? – Simon

+1

Sie könnten eine zweite Eigenschaft haben, die Sie in der Bindung verwenden, die automatisch die Und-Zeichen für den ContextMenuStrip entkommt. – user7116

0

Ich glaube nicht, dass es eine eingebaute Unterstützung dafür gibt (wie die UseMnemonic Eigenschaft der Button Steuerung), leider. Eine Möglichkeit, es zu tun, ist eine Brute-Force-Methode zu machen, die den Steuerbaum auf dem Formular werden gehen und ein durchführen ersetzen auf allen ToolStripMenuItems gefunden:

public TheForm() 
{ 

    InitializeComponent(); 
    FixAmpersands(this.Controls); 
} 

private static void FixAmpersands(Control.ControlCollection controls) 
{ 
    foreach (Control control in controls) 
    { 
     if (control is ToolStrip) 
     { 
      FixAmpersands((control as ToolStrip).Items); 
     } 
     if (control.Controls.Count > 0) 
     { 
      FixAmpersands(control.Controls); 
     } 
    } 
} 

private static void FixAmpersands(ToolStripItemCollection toolStripItems) 
{ 
    foreach (ToolStripItem item in toolStripItems) 
    { 
     if (item is ToolStripMenuItem) 
     { 
      ToolStripMenuItem tsmi = (ToolStripMenuItem)item; 
      tsmi.Text = tsmi.Text.Replace("&", "&&"); 
      if (tsmi.DropDownItems.Count > 0) 
      { 
       FixAmpersands(tsmi.DropDownItems); 
      } 
     }     
    } 
} 

Dies ist natürlich in erster Linie sinnvoll, wenn die Menüstruktur wird nicht dynamisch und gelegentlich während der Lebensdauer des Formulars aufgebaut. Wenn neue Elemente hin und wieder hinzugefügt werden, müssen Sie sie wahrscheinlich durch eine Methode ausführen, die das Und-Zeichen-Doubling bei einem einzelnen Objekt durchführt.

Verwandte Themen