web-dev-qa-db-fra.com

Aligner le texte dans la liste déroulante

Je souhaite aligner mon texte dans la liste déroulante de sorte qu'il s'affiche au centre de la liste déroulante. Expliquez-moi comment procéder. Vous pouvez également voir qu'il existe une bordure par défaut autour d'une zone de liste déroulante lorsqu'elle est au point. Comment puis-je également la supprimer? Veuillez résoudre mes deux problèmes Merci

9
user1366440

Ceci n'est pas supporté par ComboBox. Les raisons exactes sont perdues dans le brouillard du temps, ComboBox existe depuis le début des années 90, mais a certainement quelque chose à voir avec l'inconvénient d'aligner le texte de la portion de zone de texte sur le texte du menu déroulant. Les dessins personnalisés avec DrawItem ne peuvent pas non plus le résoudre, ils affectent uniquement l'apparence des éléments déroulants.

Comme solution de contournement possible, vous pourriez peut-être faire quelque chose de bizarre, comme rembourrer les chaînes d'élément avec des espaces afin qu'elles look centrées. Vous aurez besoin de TextRenderer.MeasureText () pour déterminer le nombre d'espaces à ajouter pour chaque élément.

La "bordure" dont vous parlez n'est pas une bordure, c'est le rectangle de focus. Vous ne pouvez pas vous en débarrasser non plus, Windows refuse de vous laisser créer une interface utilisateur qui ne montrera pas le contrôle avec le focus. Les utilisateurs qui préfèrent le clavier à la souris se soucient de cela. Aucune solution de contournement pour celui-là.

19
Hans Passant

Cet article vous aidera: http://blog.michaelgillson.org/2010/05/18/left-right-center-where-do-you-align/

L'astuce consiste à définir la propriété DrawMode- de la zone de liste déroulante sur OwnerDrawFixed et à s'abonner à son événement DrawItem.

Votre événement doit contenir le code suivant:

// Allow Combo Box to center aligned
private void cbxDesign_DrawItem(object sender, DrawItemEventArgs e)
{
  // By using Sender, one method could handle multiple ComboBoxes
  ComboBox cbx = sender as ComboBox;
  if (cbx != null)
  {
    // Always draw the background
    e.DrawBackground();

    // Drawing one of the items?
    if (e.Index >= 0)
    {
      // Set the string alignment.  Choices are Center, Near and Far
      StringFormat sf = new StringFormat();
      sf.LineAlignment = StringAlignment.Center;
      sf.Alignment = StringAlignment.Center;

      // Set the Brush to ComboBox ForeColor to maintain any ComboBox color settings
      // Assumes Brush is solid
      Brush brush = new SolidBrush(cbx.ForeColor);

      // If drawing highlighted selection, change brush
      if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
        brush = SystemBrushes.HighlightText;

      // Draw the string
      e.Graphics.DrawString(cbx.Items[e.Index].ToString(), cbx.Font, brush, e.Bounds, sf);
    }
  }
}

ComboBox-Preview

Pour aligner correctement les éléments, vous pouvez simplement remplacer StringAlignment.Center par StringAlignment.Far.

21
modiX

définissez la propriété 'RightToLeft' sur true. Cela n'inverse PAS la séquence de caractères. Cela justifie juste.

6
Matt Fritz

Vous ne pouvez pas faire cela dans le contrôle de formulaire Windows spécialement dans la liste déroulante

4
HatSoft

Winforms est assez peu flexible en ce qui concerne la personnalisation des contrôles. Si vous recherchez une expérience utilisateur plus personnalisée, je vous recommande de vous pencher sur la création d'une application WPF vous permettant de définir des contrôles personnalisés. Cela demandera du travail, donc ce n’est que quelque chose que vous voudrez entreprendre si vous le jugez vraiment nécessaire. Voici un site décent pour vous aider à démarrer http://www.wpftutorial.net/

2
Levi Botelho

vous pouvez faire quelque chose comme ceci en ajoutant de l'espace avant le membre d'affichage dans votre requête 

par exemple : 

combobox1.DataSource = Query(Select col1 , ('   '+col2) as Col2 from tableName) 
combobox1.DisplayMember = "Col2";
combobox1.ValueMember = "col1";
0
A.elm5zngy