我正在创建一个TabControl,它在每个动态创建的TabPage上包含一个动态创建的ListBox,每个ListBox都有不同的内容。 对于每个ListBox,我想处理内部的文本(根据显示的代码中不可见的状态更改它的颜色)。
目前,我通过使用包含文本颜色和将用于行的消息的类来为特定ListBox着色文本。
用于手动创建的ListBox的代码示例:
private void listBoxLogs_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index < 0)
{
return;
}
ListBoxLogsItem item = listBoxLogs.Items[e.Index] as ListBoxLogsItem;
if (item != null)
{
e.DrawBackground();
e.Graphics.DrawString(item.m_message, listBoxLogs.Font, item.m_color, e.Bounds, System.Drawing.StringFormat.GenericDefault);
System.Drawing.Graphics g = listBoxLogs.CreateGraphics();
System.Drawing.SizeF s = g.MeasureString(item.m_message, listBoxLogs.Font);
if (s.Width > listBoxLogs.HorizontalExtent)
{
listBoxLogs.HorizontalExtent = (int)s.Width + 2;
}
}
}
以下代码用于创建TabPage和ListBox:
// _tagName is an identifier used to know the TabPage and ListBox in which the text will be added
private void AddTabPage(string _tagName)
{
ListBox listBox = new ListBox();
listBox.Text = _tagName;
listBox.Name = _tagName;
listBox.Location = new System.Drawing.Point(6, 6);
listBox.SelectionMode = System.Windows.Forms.SelectionMode.MultiSimple;
listBox.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.listBoxLogs_DrawItem);
listBox.Size = new System.Drawing.Size(628, 378);
listBox.FormattingEnabled = true;
listBox.HorizontalScrollbar = true;
listBox.ItemHeight = 17;
listBox.TabIndex = 15;
// TODO: Remove this line. Added just for testing
listBox.Items.Add(new ListBoxLogsItem(System.Drawing.Brushes.Black, ""));
TabPage tab = new TabPage();
tab.Name = _tagName;
tab.Controls.Add(listBox);
// Add the TabPage to the TabControl only when it's available
ExecuteOnControlThread(delegate
{
tabControl.Controls.Add(tab);
});
}
我无法弄清楚如何识别调用DrawItemEventHandler&#34; this.listBoxLogs_DrawItem&#34;的ListBox。
有人可以告诉我如何做到这一点,或者以不同的方式让我得到相同的结果?
答案 0 :(得分:2)
sender
是引发您正在处理的事件的控件。在“属性”网格中创建处理程序时,所选控件是什么? ListBox。这就是提高事件的控制因素。
private void listBoxLogs_DrawItem(object sender, DrawItemEventArgs e)
{
ListBox lbSender = (ListBox)sender;
// ...other stuff
}
通常,在处理程序方法中粘贴断点并在引发事件时在运行时检查参数。这总是一种快速获取这些东西的方法。