我正在使用VS 2015在C#中编写客户端/服务器WinForms应用程序。
我有一个 ListBox 控件,其 DrawItem 事件是所有者绘制的(是的,我设置了 DrawMode 属性为 OwnerDrawFixed ),每次收到新邮件时都必须重新绘制。
我在此reference之后使用此回调:
Error: Column 'id' in where clause is ambiguous
Statement: SELECT * FROM cms_content LEFT JOIN cms_posts ON type = id WHERE id = ?
Arguments:
Array
(
[۰] => 30
)
这是 MeasureItem 方法:
private void chatLobby_DrawItem(object sender, DrawItemEventArgs e)
{
e.DrawBackground();
int ItemMargin = 0;
string last_u = "";
foreach(Message m in ChatHistory[activeChatID])
{
// Don't write the same user name
if(m.from.name != last_u)
{
last_u = m.from.name;
e.Graphics.DrawString(last_u, ChatLobbyFont.Username.font, ChatLobbyFont.Username.color, e.Bounds.Left, e.Bounds.Top + ItemMargin);
ItemMargin += ChatLobbyFont.Message.font.Height;
}
e.Graphics.DrawString(" " + m.message, ChatLobbyFont.Message.font, ChatLobbyFont.Message.color, e.Bounds.Left, e.Bounds.Top + ItemMargin);
ItemMargin += ChatLobbyFont.Message.font.Height;
}
e.DrawFocusRectangle();
}
使用private void chatLobby_MeasureItem(object sender, MeasureItemEventArgs e)
{
// No messages in the history
if(ChatHistory[activeChatID][0] == null)
{
e.ItemHeight = 0;
e.ItemWidth = 0;
}
string msg = ChatHistory[activeChatID][e.Index].message;
SizeF msg_size = e.Graphics.MeasureString(msg, ChatLobbyFont.Message.font);
e.ItemHeight = (int) msg_size.Height + 5;
e.ItemWidth = (int) msg_size.Width;
}
收到并插入邮件,它确实有效,由调试器确认。
但 ListBox仅在我点击它时重绘(我认为它会引发焦点)。
我已经尝试了ListBox.Add()
,.Update()
和.Refresh()
而没有运气。
有没有办法从代码中触发.Invalidate()
?
答案 0 :(得分:0)
经过一些研究,我找到了解决方案:当控件被更改时,会调用 DrawItem 事件。
事实上,.Add()
可以解决问题。
我改变了我的更新功能:
private void getMessages()
{
// ... <--- connection logic here
chatLobby.Items.Add(" "); // Alters the listbox
}