2014-06-10 43 views
1

我已經重寫了onPaint方法,並且計劃做一個小修改,我需要從我的VB.NET代碼中將一個列表傳遞給這個C#腳本。下面是我的代碼。如何覆蓋此onPaint方法以傳遞列表?

protected override void OnPaint(PaintEventArgs e) 
      { 
       base.OnPaint(e);  
       e.Graphics.Clear(SystemColors.Window); 
       for (int i = 0; i < Months.Length; i++) 
       { 

        foreach (MonthViewDay day in Months[i].Days) 
        { 
         if (!day.Visible) continue; 

         MonthViewBoxEventArgs evtDay = new MonthViewBoxEventArgs(e.Graphics, day.Bounds, day.Date.Day.ToString(), 
          StringAlignment.Far, 
          day.Grayed ? DayGrayedText : (day.Selected ? DaySelectedTextColor : ForeColor), 
          day.Selected ? DaySelectedBackgroundColor : DayBackgroundColor); 

         if (day.Date.Equals(DateTime.Now.Date)) 
         { 
          evtDay.BorderColor = TodayBorderColor; 
         } 
//this is where I plant to add my code IF I get to know to pass a list 
         else 
         { 
          //search if day.Date is present in the list 
          //if present then update a different border color 
         }      
         DrawBox(evtDay); 
        } 

請注意,我的列表參數是另一個自定義類。 我應該在這裏使用任何解決方案或方法?

在此先感謝。

回答

1

無法通過OnPaint事件,你可以做什麼打發列表是通過另一種方式,並使用parmater在油漆事件

您可以修改類,如下所示:

Object obj = new Object(); 
List<int> _list = new List<int>(); 
Public void PassList(List<int> myList) 
{ 
    lock(obj) 
    { 
     _list = myList; 
    } 
} 

protected override void OnPaint(PaintEventArgs e) 
{ 
    lock(obj) 
    { 
      // Do something with the _list 
    } 
} 
+0

究竟應該從我的VB.NET代碼中調用此PassList方法?它是否在表單加載事件期間? –

+0

這取決於你的業務邏輯,你可以通過表單加載或在窗體構造函數 –

+0

對不起,這是新的,我仍然想知道什麼時候這個onPaint會被調用。我不確定當我的窗體構造函數被調用或onFormLoad時會不會調用它。:(任何幫助? –

1

onPaint事件的簽名是

protected virtual void OnPaint(PaintEventArgs e) 

因此,你不能傳遞任何其他參數,尤其是PaintEventArgs不哈已經任何附加屬性,如DataExtendedProperties

  • 你可以宣佈你在表單級別[或者,我應該說,職業等級]列表和onPaint中使用它。
  • 如果,可以說,你的油漆是在不同的線程中發生的事情,當你設置線程,則可以使用Thread.SetData通過您的列表,然後通過發行Thread.GetData檢索它在你的onPaint
  • 你可以設置你的清單在某種靜態類的,並抓住它從那裏
+0

我不想嘗試線程方法出於某種原因... +1班級建議:) –

+0

@VenkatRaman我不會把它推到你身上。只是說「如果」涉及另一個線程。 –

0

這是我做過什麼......

我加了一個處理程序Paint事件

AddHandler this.monthView1.Paint, AddressOf this.iPass //this is the method that would pass the list 

我加入的方法更新我的自定義控制,由@user

public void PassList(List<DateTime> myList) 
    { 
     lock (obj) 
     { 
      _list = myList; 
     } 
    } 

提到現在,在我的protected override void OnPaint(PaintEventArgs e)事件中,我能夠訪問_list並執行相應的操作