web-dev-qa-db-ja.com

コンボボックスのテキストを揃える

テキストをコンボボックスに揃えて、コンボボックスの中央に表示されるようにして、これを行う方法を教えてください。フォーカスがあるときにコンボボックスの周囲にデフォルトの境界があることを確認できます。境界を削除する方法も親切に私の2つの問題を解決してください

11
user1366440

これはComboBoxではサポートされていません。正確な理由は時間の霧の中で失われます。ComboBoxは90年代前半から存在していますが、テキストボックス部分のテキストをドロップダウンのテキストと揃えるという厄介なことと関係があります。 DrawItemを使用したカスタム描画でも解決できず、ドロップダウンアイテムの外観にのみ影響します。

可能な回避策として、アイテム文字列にスペースを埋め込んでlook中央揃えにするなど、風変わりなことを行うことができます。各アイテムに追加するスペースの数を把握するには、TextRenderer.MeasureText()が必要です。

あなたが話している「ボーダー」はボーダーではなく、フォーカス長方形です。それを取り除くこともできません。Windowsでは、フォーカスのあるコントロールを表示しないUIの作成を拒否しています。マウスよりキーボードを好むユーザーはそれを気にかけます。そのための回避策はありません。

22
Hans Passant

この記事はあなたに役立ちます: http://blog.michaelgillson.org/2010/05/18/left-right-center-where-do-you-align/

トリックは、ComboBoxのDrawMode- PropertyをOwnerDrawFixedに設定し、そのイベントDrawItemをサブスクライブすることです。

イベントには次のコードを含める必要があります。

// 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

アイテムを右揃えするには、StringAlignment.CenterStringAlignment.Far

25
Martin Braun

RightToLeftプロパティをtrueに設定します。
文字の順序を逆にすることはありません。正当化されるだけです。

7
Matt Fritz

これは、Windowsフォームコントロールの特別なコンボボックスでは実行できません。

4
HatSoft

Winformsは、コントロールのカスタマイズに関してはかなり柔軟性がありません。よりカスタマイズされたユーザーエクスペリエンスを求めている場合は、カスタムコントロールを定義できるWPFアプリケーションの作成を検討することをお勧めします。ただし、多少の作業が必要になるため、本当に必要な場合にのみ実行する必要があります。ここにあなたを始めるためのまともなサイトがあります http://www.wpftutorial.net/

2
Levi Botelho

投稿は少し古いですが、それでも言う価値があるかもしれません:

windowsフォームコンボボックスでは、両方の要件が可能です。

  • テキストの中央揃え(テキスト領域とドロップダウン)
    • テキスト領域の場合、Editコントロールを見つけて、コントロールのES_CENTERスタイルを設定します。
    • ドロップダウンアイテムまたはドロップダウンモードで選択されたアイテムの場合、テキストを中央に揃えるには、コントロールをオーナー描画し、テキストを中央に描画します。
  • フォーカス長方形を取り除く
    • コントロールをオーナー描画にし、フォーカス長方形を描画しないようにします。

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class MyComboBox : ComboBox
{
    public MyComboBox()
    {
        DrawMode = DrawMode.OwnerDrawFixed;
    }

    [DllImport("user32.dll")]
    static extern int GetWindowLong(IntPtr hWnd, int nIndex);
    [DllImport("user32.dll")]
    static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
    const int GWL_STYLE = -16;
    const int ES_LEFT = 0x0000;
    const int ES_CENTER = 0x0001;
    const int ES_RIGHT = 0x0002;
    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
        public int Left;
        public int Top;
        public int Right;
        public int Bottom;
        public int Width { get { return Right - Left; } }
        public int Height { get { return Bottom - Top; } }
    }
    [DllImport("user32.dll")]
    public static extern bool GetComboBoxInfo(IntPtr hWnd, ref COMBOBOXINFO pcbi);

    [StructLayout(LayoutKind.Sequential)]
    public struct COMBOBOXINFO
    {
        public int cbSize;
        public RECT rcItem;
        public RECT rcButton;
        public int stateButton;
        public IntPtr hwndCombo;
        public IntPtr hwndEdit;
        public IntPtr hwndList;
    }
    protected override void OnHandleCreated(EventArgs e)
    {
        base.OnHandleCreated(e);
        SetupEdit();
    }
    private int buttonWidth = SystemInformation.HorizontalScrollBarArrowWidth;
    private void SetupEdit()
    {
        var info = new COMBOBOXINFO();
        info.cbSize = Marshal.SizeOf(info);
        GetComboBoxInfo(this.Handle, ref info);
        var style = GetWindowLong(info.hwndEdit, GWL_STYLE);
        style |= 1;
        SetWindowLong(info.hwndEdit, GWL_STYLE, style);
    }
    protected override void OnDrawItem(DrawItemEventArgs e)
    {
        base.OnDrawItem(e);
        e.DrawBackground();
        var txt = "";
        if (e.Index >= 0)
            txt = GetItemText(Items[e.Index]);
        TextRenderer.DrawText(e.Graphics, txt, Font, e.Bounds,
            ForeColor, TextFormatFlags.Left | TextFormatFlags.HorizontalCenter);
    }
}
0
Reza Aghaei

クエリのDisplayメンバーの前にスペースを追加することで、このようなことを行うことができます

例えば ​​:

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