6

DevExpress 製の XtraGrid Suite を使用しています。これを行うための機能は見つかりませんが、グリッド セルにボタンまたはハイパーリンクを追加できるかどうか知りたいです。

コンテキスト: イベント リストがあります。各イベントには、時刻、開始/終了、およびカテゴリ (ユーティリティとメンテナンス) があります。Start イベントと Stop イベントがあります。問題を分析した結果、各イベントに StartTime と EndTime を設定してもうまくいかないと判断しました。

イベントが開始したら、現在の時刻を Event オブジェクトに記録し、それを「開始」イベントとして設定します。その行のセルに「停止」ボタン/ハイパーリンクを追加したいと思います。ユーザーが Ends イベントをログに記録したい場合、イベントの種類などが「停止」タイプの新しいイベントにコピーされ、ボタンが表示されなくなります。

これが理にかなっていることを願っています。

編集: Aaronaught の回答は、実際には私が最初に求めていたもの (ボタン) よりも優れているため、質問を更新しました。そうすれば、セルにハイパーリンクを配置しようとしている人は誰でも、彼の例から恩恵を受けることができます:)

4

4 に答える 4

15

ボタンはグリッドの典型的な行の高さに合わせすぎないため、描画コードをオーバーライドし、マウスの移動/クリック イベントを処理することで、ハイパーリンク スタイルのテキストを使用することを好みます。ただし、ボタンが本当に必要な場合は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>.

  • MyColorspublic static readonly ColorUI に使用されるいくつかのフィールドを定義するユーティリティ クラスです。1 つのグリッドでのみこれを行う場合は、その参照をハードコードされた色に置き換えることができます。

  • をキャッシュする必要はありませんが、キャッシュはFont2 つしかないため、おそらく可能です。

  • カーソル ロジックは、グリッドで使用する可能性のある他のカーソル ロジックを台無しにします (これは、ほとんどすべてのケースで事実上何もないため、一般的には問題ないはずです)。

  • 複数の「リンク列」が必要な場合は、hoverColumnに加えて状態フィールドを維持する必要がありhoverRowHandle、それらの単一列の等価比較を明らかに変更して、複数の列を検索します。

私自身の Winforms アプリの場合、実際には、列名とリンク テキストのペアのリストを投げて、この動作を にアタッチできるエクステンダー プロバイダーがありますGridViewListView、そのコードは、ここに投稿するには少し長すぎます。上記の例から始めてください。

于 2010-01-30T02:23:47.500 に答える
5

を使用してRepositoryItemButtonEditを に設定TextEditStyleHideTextEditorます。

于 2010-01-30T02:31:08.133 に答える
2

これは、RepositoryItemHyperLinkEdit コントロールを使用して実現できるようになりました。

参照: RepositoryItemHyperLinkEdit クラス

于 2013-03-25T00:29:16.783 に答える
1

RepositoryItemButtonEdit を使用できます。ターゲット列を選択し、[プロパティ] で [ColumnEdit] をクリックして [新規] を選択し、[ButtonEdit] を選択します。グリッドをクリックして「run designer」を選択し、「Repository」グループで「in-place Editor Repository」を選択します。「repositoryItemButtonEdit1」を選択 (ボタン編集コンポーネント名を変更していない場合) 「イベント」タブを選択し、「ButtonPressed」イベントを選択します。このイベントにコードを入力してください。必要に応じて、コンポーネントのエディター部分を非表示にし、ターゲット列を選択し、[プロパティ] で [ColumnEdit] をクリックし、[TextEditStyle] を見つけて [HideTextEditor] を選択します。

でも、ひとつ質問が!?? ボタンに画像を追加したいのですが、誰かアイデアがありますか?

于 2010-03-16T06:58:35.717 に答える