19

List を DataGridView にバインドしています。SomeObject クラスの 1 つのプロパティは、ステータス コード (例: 赤、黄、緑) になります。ステータスをセルの背景色に簡単に「バインド」できますか? ツールチップにもバインドするのはどうですか?

4

2 に答える 2

36

DataGridView の CellFormatting イベントのハンドラーを記述して、背景色をカスタマイズできます。実際の例を次に示します (DataGridView を既定のフォームにドラッグし、CellFormatting イベントをダブルクリックしてハンドラーを作成する必要があります)。

using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private BindingSource _source = new BindingSource();

        public Form1()
        {
            InitializeComponent();

            _source.Add(new MyData(Status.Amber, "Item A"));
            _source.Add(new MyData(Status.Red, "Item B"));
            _source.Add(new MyData(Status.Green, "Item C"));
            _source.Add(new MyData(Status.Green, "Item D"));

            dataGridView1.DataSource = _source;
            dataGridView1.Columns[0].Visible = false;
        }

        private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.ColumnIndex == 1)
            {
                DataGridView dgv = sender as DataGridView;
                MyData data = dgv.Rows[e.RowIndex].DataBoundItem as MyData;

                switch (data.Status)
                {
                    case Status.Green:
                        e.CellStyle.BackColor = Color.Green;
                        break;
                    case Status.Amber:
                        e.CellStyle.BackColor = Color.Orange;
                        break;
                    case Status.Red:
                        e.CellStyle.BackColor = Color.Red;
                        break;
                }
            }
        }
    }

    public class MyData
    {
        public Status Status { get; set; }
        public string Text { get; set; }

        public MyData(Status status, string text)
        {
            Status = status;
            Text = text;
        }
    }

    public enum Status
    {
        Green,
        Amber,
        Red
    }
}

ここのオブジェクトには、簡単にするために Status と Text だけがあります。これらのオブジェクトのサンプル セットの BindingSource を作成し、それを DataGridView のデータ ソースとして使用します。デフォルトでは、グリッドはバインド時に列を自動的に生成するため、手動で行う必要はありません。代わりにテキスト セルに色を付けるため、Status 値にバインドされている最初の列も非表示にします。

実際に描画するには、CellFormatting イベントに応答します。送信者をキャストすることによって DataGridView への参照を取得し、次に DataGridViewCellFormattingEventArgs オブジェクトの RowIndex プロパティを使用してデータ項目自体を取得します (各行には、これを便利に提供する DataBoundItem プロパティがあります)。DataBoundItem はオブジェクト型であるため、特定の型にキャストする必要があります。その後、実際に Status プロパティ自体を取得できます...ふぅ!

ツールチップ プログラミングの経験はありませんが、MouseHover イベントに応答してから、どの行が指されているかを発見する作業を開始する必要があると考えていました。

これが役立つことを願っています。

于 2008-12-04T09:51:36.300 に答える
2

デフォルトでは、任意の DataGridViewColumn を DataSource 内のオブジェクトの 1 つのプロパティのみにバインドできます。プロパティの名前は、各 DataGridViewColumn の DataPropertyName によって指定されます (DataGridViewTextBoxColumn などの特定の列タイプがあります)。 .

DataGridView.CellFormatting イベントを使用して、データバインドされた項目に応じてセルのスタイルを変更できます。このイベントの DataGridViewCellFormattingEventArgs で行インデックスを取得し、そこから現在のオブジェクト (行のソース) を取得できます。そこから、オブジェクトの任意のプロパティを使用してセルに影響を与えることができます。

良い出発点(同様のアイデア):ここ

2 番目のアイデアは、独自の DataGridViewColumn タイプを開発し、バインドする必要がある他のものにプロパティを追加することです。たとえば、DataPropertyName が組み込まれているのと同じ方法で、独自の BackgroundColorPropertyName を追加できます。カスタム DataGridViewColumns を構築するための出発点は、ここにあります。

于 2008-12-04T09:49:43.857 に答える