Как переопределить этот метод onPaint для передачи списка?

1

Я переопределил метод onPaint, и я планирую сделать небольшую модификацию, для которой мне нужно передать список этого сценария С# из моего кода VB.NET. Ниже мой код.

    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);
                    }

Просто примечание, мой параметр списка - другой пользовательский класс. Любые решения или подход, которые я должен использовать здесь?

Заранее спасибо.

Теги:
onpaint
override

3 ответа

1
Лучший ответ

Вы не можете передать список через событие onPaint, что вы можете сделать, это передать его другим способом и использовать этот parmater в событии on paint

Вы можете изменить свой класс следующим образом:

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
    где именно я должен вызывать этот метод PassList из моего кода VB.NET? Это происходит во время события загрузки формы?
  • 0
    Это зависит от вашей бизнес-логики, которую вы можете передать при загрузке формы или в конструкторе формы
Показать ещё 4 комментария
1

Подпись события onPaint

protected virtual void OnPaint(PaintEventArgs e)

Поэтому вы не можете передавать какие-либо другие аргументы, особенно, что PaintEventArgs не имеет никаких дополнительных свойств, таких как Data или ExtendedProperties

  • Вы можете объявить свой список на уровне формы [или, скажем, уровне класса] и использовать его в своем onPaint.
  • Если, скажем, ваша краска происходит в другом потоке, когда вы устанавливаете поток, вы можете передать свой список с помощью Thread.SetData а затем получить его в своем onPaint, выпустив Thread.GetData.
  • вы можете установить свой список в каком-то статическом классе и захватить его оттуда
  • 0
    Я не хотел пробовать потоковый подход по какой-то причине ... +1 за совет на уровне класса :)
  • 0
    @VenkatRaman Я не давлю на тебя. Просто сказать, что «если» другой поток участвует.
0

это то, что я сделал...

Я добавил обработчик для события рисования

  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 и выполнить соответствующие операции

Ещё вопросы

Сообщество Overcoder
Наверх
Меню