>

동적으로 생성 된 각 TabPage에 동적으로 생성 된 ListBox를 포함하는 TabControl을 만들고 있는데, 각각은 다른 내용을 가지고 있습니다. 각 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 "this.listBoxLogs_DrawItem"을 호출하는 ListBox를 식별하는 방법을 알 수 없습니다.

누군가가이 작업을 수행 할 수있는 방법이나 같은 결과를 얻을 수있는 다른 방법을 알려주시겠습니까?

  • 답변 # 1

    sender  처리중인 이벤트를 발생시킨 컨트롤입니다. 속성 표에서 처리기를 만들 때 선택된 컨트롤은 무엇입니까? ListBox입니다. 이것이 바로 이벤트를 발생시키는 컨트롤입니다.

    private void listBoxLogs_DrawItem(object sender, DrawItemEventArgs e)
    {
        ListBox lbSender = (ListBox)sender;
        // ...other stuff
    }
    
    

    일반적으로, 핸들러 메소드에 중단 점을두고 이벤트가 발생할 때 런타임에 매개 변수를 검사하십시오. 그것은 항상 이런 것들로 베어링을 얻는 빠른 방법입니다.

  • 이전 sql server - from 절의 하위 쿼리 끝에서 임의 문자의 중요성 - sql
  • 다음 php - 카테고리 페이지에서 Magento의 주문/정렬 컬렉션은 어디에 있습니까?