バックグラウンド
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 に配置すればフォントを固着させることができますが、フォームが読み込まれたときに一度だけ実行する必要があるため、やり過ぎのように思えます。フォームが表示された後にプロセスを実行すると正常に動作します。
嘆願
誰か提案があれば、私はそれらを感謝します。ありがとう!