2

バックグラウンド

WinForm のボタンを押すと、DataGridView のデータ ソースとして機能する BindingSource にデータが読み込まれます。データが読み込まれたら、DataGridView にいくつかの変更を加えます。具体的には、1) DBNull として値が設定されているセルを文字列値 "NULL" に設定し、2) 同じセルをイタリック体にし、3) いくつかの行を強調表示します。

私がやっていることの簡単な例:

private void btnFetch_Click(object sender, EventArgs e)
{
    // If there's already a DataSource, Dispose of it.
    if (bsMessageTracking.DataSource != null)
    {
        (bsMessageTracking.DataSource as DataTable).Dispose();
    }

    // Get new DataSource.
    bsMessageTracking.DataSource = GetDataTable(); // Details not relevant.

    // Show NULL values.
    foreach (DataGridViewRow row in dgv.Rows)
    {
        foreach (DataGridViewCell cell in row.Cells)
        {
            if (cell.Value is DBNull)
            {
                cell.Value = "NULL";
                cell.Style.Font = new Font(dgv.DefaultCellStyle.Font, FontStyle.Italic);
            }
        }
    }

    // Apply highlighting.
    foreach (DataGridViewRow row in dgvMessageTracking.Rows)
    {
        if (HighlightRow(row)) // Details not relevant.
        {
            row.DefaultCellStyle.BackColor = Color.LightYellow;
        }
    }
}

データは、フォームの TextBox への入力に基づいて読み込まれます。

状況

ボタンのクリックでこれが発生すると、すべてがうまく機能します。ただし、ユーザーに利便性を提供するために、このフォームにデータが事前に取り込まれた状態で読み込まれるようにしています。メイン フォームは、TextBox に入力するデータを使用してこのフォームをインスタンス化し、この btnFetch_Click ハンドラーがコンストラクターから呼び出されます。 :

internal MessageTracking(string ID)
{
    InitializeComponent();

    // Setup data source.
    dgvMessageTracking.DataSource = bsMessageTracking;

    // Set ID and run query.
    if (ID != null)
    {
        // Set ID.
        txtlID.Text = ID;

        // Run!
        btnFetch_Click(null, null);
    }
}

セルの値が変更されます (NULL が表示されます) が、フォントと強調表示は固執しません。

私が試したこと

OnShown メソッドで強調表示のコードを複製すると、強調表示が固定されます。ただし、そこでフォント コードを複製しても機能しません。CellFormatting に配置すればフォントを固着させることができますが、フォームが読み込まれたときに一度だけ実行する必要があるため、やり過ぎのように思えます。フォームが表示された後にプロセスを実行すると正常に動作します。

嘆願

誰か提案があれば、私はそれらを感謝します。ありがとう!

4

2 に答える 2

1

使用しているイベント ハンドラーについては、@zimdanen のように dataGridView Cell_Formatting を使用することをお勧めします。しかし、これが私がそれを機能させる方法です。

    private void small8PtToolStripMenuItem_Click(object sender, EventArgs e)
    {
        fontSize = 8;
        dataGridBatchHistory.Refresh();
    }

fontSize は、フォントを動的に設定するために使用した整数で、ほとんどのプロパティをこの方法で設定できます。CellFormatting 関数を呼び出すよりも

    private void dataGridBatchHistory_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        e.CellStyle.Font = new Font("Tahoma", fontSize);
    }

これにより、ツールストリップのメニュー項目をクリックすると、フォームが新しい正しいサイズで更新されます。ただし、これは作成できる多くのイベントで機能すると思います。

于 2012-08-08T20:32:37.607 に答える
0

応答がないことから、フォームが最初に表示されるときにフォーマットを表示したい場合、これ以上の方法はないと思います。Show NULL valuesハンドラーの一部を削除し、btnFetch_Clickこのハンドラーを追加dgvMessageTracking_CellFormattingして、常にこの機能を処理できるようにしました。

private void dgvMessageTracking_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (e.Value is DBNull)
    {
        e.Value = "NULL";
        e.CellStyle.Font = new Font(dgvMessageTracking.DefaultCellStyle.Font, FontStyle.Italic);
    }
}
于 2012-04-25T12:50:08.433 に答える