ボタンはグリッドの典型的な行の高さに合わせすぎないため、描画コードをオーバーライドし、マウスの移動/クリック イベントを処理することで、ハイパーリンク スタイルのテキストを使用することを好みます。ただし、ボタンが本当に必要な場合はRepositoryItemButtonEdit
、エディター タイプとして を使用して実行できるはずです。
前者に興味がある場合は、コメントを残してください。これを例で更新します。それ以外の場合は、前述のように、RepositoryItemButtonEdit
. 必要に応じてセル全体を占めるようにプロパティを変更してから、ボタンが引き伸ばされないように列を固定サイズにすることができます。
更新:以下の「きれいなハイパーリンク」のサンプル コードを投稿しています。これは、(a) 見栄えがよく、(b) ホバー フィードバックを提供し、(c) できるため、標準のハイパーリンク セルよりもはるかに優れています。必要に応じてカーソルを変更します (私はユーティリティ メソッドを使用して、OS からネイティブのハンド カーソルを取得します。これは、Winforms の組み込みハンドよりも 3D の外観を持っています)。
これを読んでいる DevExpress 以外のユーザーへの注意: 標準とほぼ同じ手法を使用していますSystem.Windows.Forms.ListView
。Microsoft は、Vista と Windows 7 でこの UI パターンをかなり使用しており、結果が完全なレプリカでなくても、その方法を学ぶのは良いことです。
private int hoverRowHandle = GridControl.InvalidRowHandle;
private void gridView_Click(object sender, EventArgs e)
{
if (hoverRowHandle != GridControl.InvalidRowHandle)
{
MyItem item = gridView.GetRow(hoverRowHandle) as MyItem;
if (item != null)
// Do whatever the "click" action is here
}
}
private void gridView_CustomDrawCell(object sender,
RowCellCustomDrawEventArgs e)
{
if (e.Column == linkColumn)
{
bool hover = (hoverRowHandle == e.RowHandle);
FontStyle style = hover ? FontStyle.Underline : FontStyle.Regular;
TextFormatFlags formatFlags =
TextFormatFlags.Left | TextFormatFlags.VerticalCenter |
TextFormatFlags.WordEllipsis;
Color foreColor = gridView.IsRowSelected(e.RowHandle) ?
Color.White : (hover ? MyColors.LinkHover : MyColors.Link);
using (Font font = new Font(gridControl.Font, style))
{
TextRenderer.DrawText(e.Graphics, "Link Text", font, e.Bounds,
foreColor, formatFlags);
}
e.Handled = true;
}
}
private void gridView_MouseLeave(object sender, EventArgs e)
{
int tempRowHandle = hoverRowHandle;
hoverRowHandle = GridControl.InvalidRowHandle;
if (tempRowHandle != GridControl.InvalidRowHandle)
{
gridView.InvalidateRowCell(tempRowHandle, linkColumn);
}
}
private void gridView_MouseMove(object sender, MouseEventArgs e)
{
int tempRowHandle = hoverRowHandle;
if (tempRowHandle != GridControl.InvalidRowHandle)
{
hoverRowHandle = GridControl.InvalidRowHandle;
gridView.InvalidateRowCell(tempRowHandle, linkColumn);
}
GridHitInfo hitInfo = gridView.CalcHitInfo(e.Location);
if (hitInfo.InRowCell && (hitInfo.Column == linkColumn))
{
hoverRowHandle = hitInfo.RowHandle;
gridView.InvalidateRowCell(hoverRowHandle, linkColumn);
}
bool hoverDetail = (hoverRowHandle != GridControl.InvalidRowHandle);
gridControl.Cursor = hoverDetail ? Cursors.Hand : Cursors.Default;
}
このコードに関する注意事項:
MyItem
グリッド ビューにバインドしたデータの種類は何でもです。データDataRow
ソースがIList<T>
.
MyColors
public static readonly Color
UI に使用されるいくつかのフィールドを定義するユーティリティ クラスです。1 つのグリッドでのみこれを行う場合は、その参照をハードコードされた色に置き換えることができます。
をキャッシュする必要はありませんが、キャッシュはFont
2 つしかないため、おそらく可能です。
カーソル ロジックは、グリッドで使用する可能性のある他のカーソル ロジックを台無しにします (これは、ほとんどすべてのケースで事実上何もないため、一般的には問題ないはずです)。
複数の「リンク列」が必要な場合は、hoverColumn
に加えて状態フィールドを維持する必要がありhoverRowHandle
、それらの単一列の等価比較を明らかに変更して、複数の列を検索します。
私自身の Winforms アプリの場合、実際には、列名とリンク テキストのペアのリストを投げて、この動作を にアタッチできるエクステンダー プロバイダーがありますGridView
がListView
、そのコードは、ここに投稿するには少し長すぎます。上記の例から始めてください。