テキストをコンボボックスに揃えて、コンボボックスの中央に表示されるようにして、これを行う方法を教えてください。フォーカスがあるときにコンボボックスの周囲にデフォルトの境界があることを確認できます。境界を削除する方法も親切に私の2つの問題を解決してください
これはComboBoxではサポートされていません。正確な理由は時間の霧の中で失われます。ComboBoxは90年代前半から存在していますが、テキストボックス部分のテキストをドロップダウンのテキストと揃えるという厄介なことと関係があります。 DrawItemを使用したカスタム描画でも解決できず、ドロップダウンアイテムの外観にのみ影響します。
可能な回避策として、アイテム文字列にスペースを埋め込んでlook中央揃えにするなど、風変わりなことを行うことができます。各アイテムに追加するスペースの数を把握するには、TextRenderer.MeasureText()が必要です。
あなたが話している「ボーダー」はボーダーではなく、フォーカス長方形です。それを取り除くこともできません。Windowsでは、フォーカスのあるコントロールを表示しないUIの作成を拒否しています。マウスよりキーボードを好むユーザーはそれを気にかけます。そのための回避策はありません。
この記事はあなたに役立ちます: 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);
}
}
}
アイテムを右揃えするには、StringAlignment.Center
とStringAlignment.Far
。
RightToLeft
プロパティをtrue
に設定します。
文字の順序を逆にすることはありません。正当化されるだけです。
これは、Windowsフォームコントロールの特別なコンボボックスでは実行できません。
Winformsは、コントロールのカスタマイズに関してはかなり柔軟性がありません。よりカスタマイズされたユーザーエクスペリエンスを求めている場合は、カスタムコントロールを定義できるWPFアプリケーションの作成を検討することをお勧めします。ただし、多少の作業が必要になるため、本当に必要な場合にのみ実行する必要があります。ここにあなたを始めるためのまともなサイトがあります http://www.wpftutorial.net/
投稿は少し古いですが、それでも言う価値があるかもしれません:
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);
}
}
クエリのDisplayメンバーの前にスペースを追加することで、このようなことを行うことができます
例えば :
combobox1.DataSource = Query(Select col1 , (' '+col2) as Col2 from tableName)
combobox1.DisplayMember = "Col2";
combobox1.ValueMember = "col1";