我有一个绑定到DataTable的DataGridView。 DataTable的其中一列是Type IMessages
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没有显示&#34;警告&#34;在单元格中的单词,链接工作正常,但单元格是空白的。 我认为在Messages类中重写ToString()会使它成为但它没有。
答案 0 :(得分:0)
而是在RowsAdded
事件处理程序中添加值,直接在源代码中添加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
控件与DataSource
绑定忽略,因为它正在从源DataTable
读取值,而现在DataTable
在任何行中都没有Message对象。这是我的假设我可能是错的。
答案 1 :(得分:0)
我发现了问题。
如果我要删除IMessages接口并处理Messages实例,则会获取ToString()重写方法,并在单元格中显示“警告”文本。
调用以下行时,将调用ToString()方法。但是当单元格绑定到接口时,不会调用ToString()方法。
dataGridView.Rows[e.RowIndex].Cells["Messages"].Value = messages;
为了使它在不脱离接口的情况下工作,我在DataGridView的单元格格式化事件期间调用了ToString()方法:
private void PODetailsDGV_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (e.RowIndex == -1) return;
if (e.Value != null && dataGridView.Columns["Messages"].Index == e.ColumnIndex)
{
e.Value = e.Value.ToString();
}
}