DataTableにバインドされたDataGridViewがあります。 のDataTableの列の一つは、タイプIMessagesであるクラスのインスタンスを表すDataGridViewCellにテキストを表示する方法
DataTable source = _applicationManager.Retrieve(); // Populate DataTable
source.Columns.Add("Messages", typeof(IMessages));
dataGridView.DataSource = source;
IMessagesインタフェース:
interface IMessages : IEnumerable<IMessage>
{
string GetMessages { get; }
string ToString();
}
メッセージクラス:
class Messages : IMessages
{
/* This code is less relevant, here just to show you the entire picture
private List<IMessage> _messagesList;
public string GetMessages
{
get
{
var messages = new StringBuilder();
foreach (IMessage message in _messagesList)
{
messages.AppendLine(message.ToString());
}
return messages.ToString();
}
}
***********************************/
public override string ToString()
{
return "warning"; // TODO
}
}
のDataGridViewイベント:
private void dataGridView_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
var messages = _applicationManager.GetMessages() as IMessages;
if (messages.Any())
{
dataGridView.Rows[e.RowIndex].Cells["Messages"].Value = messages;
}
}
private void dataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
var messages = dataGridView.Rows[e.RowIndex].Cells["Messages"].Value as IMessages;
if (messages != null)
{
MessageBox.Show(messages.GetMessages, "Messages", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
問題は、DataGridViewがセルに「警告」単語を表示せず、リンクが正常に動作していてもセルが空白であることです。 私は、メッセージクラスのToString()をオーバーライドするとそれを作るが、そうではないと思った。むしろDataTable
DataTable source = _applicationManager.Retrieve(); // Populate DataTable
source.Columns.Add("Messages", typeof(IMessages));
// ------- changed code ------------------
// this is just an example, you can also place a loop here
// and iterate through all the lines in the DataTable and set the object
// in the "Messages" column
source.Rows[0]["Messages"] = messageobject;
// --------------------------------------------------
dataGridView.DataSource = source;
すなわちソースに直接DataGridView
コントロールがしてバインドされているので、可能性が表示されていない理由を追加し、RowsAdded
イベントハンドラに値を追加すること