Как изменить цвет определенных дат в элементе управления MonthCalendar?

Как изменить цвет определенных дат в элементе управления MonthCalendar в VB.NET?

Например, мне нужно изменить цвет 21 января на красный, воскресенья на оранжевый и так далее...


person SpongeBob SquarePants    schedule 19.02.2011    source источник
comment
Какая у тебя версия для визуальной студии? 2005 или 2008 или 2010. И могу ли я предположить, что месячный календарь предназначен для winform?   -  person william    schedule 19.02.2011


Ответы (4)


Это невозможно. Не существует встроенного способа настройки отображения отдельных дней или дат в элементе управления MonthCalendar.

Вы могли нарисовать элемент управления, но это слишком много работы, чтобы ее можно было оправдать. Это сделает вас ответственным за отрисовку всего элемента управления самостоятельно. Обратите внимание, что если вы решите пойти по этому пути, элемент управления MonthCalendar не вызовет событие Paint, поскольку базовый элемент управления устанавливает бит UserPaint в значение "False". Вам придется создать подкласс элемента управления и переопределить его OnPrint метод вместо этого.

Я не могу лично рекомендовать какие-либо сторонние элементы управления, которые обеспечивают такой уровень настройки, но быстрый поиск в Google действительно показывает несколько вариантов:

person Cody Gray    schedule 19.02.2011
comment
Есть ли какой-нибудь сторонний компонент, который упростил бы работу? - person SpongeBob SquarePants; 19.02.2011
comment
@abcd: Не тот, о котором я знаю или мог бы порекомендовать лично. Я обновил свой ответ несколькими, которые появляются при быстром поиске в Google. - person Cody Gray; 20.02.2011
comment
Это все С#. Кто-нибудь знает какие-либо элементы управления VB.net? - person Urbycoz; 17.07.2013
comment
@Urbycoz Неважно, на каком языке находятся элементы управления. Просто укажите DLL из своего решения. Или, если вы хотите получить доступ к исходному коду, добавьте новый проект C# в существующее решение и укажите ссылку на созданную им библиотеку DLL. - person Cody Gray; 17.07.2013

Попробуй это:

Private Sub pintaCalendarioNaData(ByRef mc As MonthCalendar, ByVal data As Date, ByVal cor As String)
        Dim gMonthCalendar As Graphics = mc.CreateGraphics()
        Dim oHTIMonths As MonthCalendar.HitTestInfo
        Dim arrDates As New ArrayList()
        Try
            For intRows As Integer = 1 To mc.Size.Width - 1
                For intCols As Integer = 1 To mc.Size.Height - 1
                    oHTIMonths = mc.HitTest(intRows, intCols)
                    If oHTIMonths.HitArea = MonthCalendar.HitArea.Date Then
                        If CDate(mc.HitTest(intRows, intCols).Time) = CDate(data) Then
                             gMonthCalendar.DrawRectangle(New Pen(ColorTranslator.FromHtml(cor), 2), intRows, intCols, 24, 15)
                            GoTo fim
                        End If
                    End If
                Next intCols
            Next intRows
fim:
        Catch ex As Exception
            MessageBox.Show("Error: " & vbNewLine & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Err.Clear()
        Finally

        End Try
    End Sub

Эта подпрограмма рисует один MonthCalendar (mc) в одну конкретную дату (данные) одним цветом (cor)

person Ricardo Rodrigues    schedule 02.06.2016

В Visual Studio 2005 вы перетаскиваете месячный календарь из панели инструментов.

Зайдите в свойства.

Есть годовые даты, выделенные жирным шрифтом, ежемесячные даты, выделенные жирным шрифтом, и даты, выделенные жирным шрифтом. Вы можете добавить нужные даты в эти свойства.

person william    schedule 19.02.2011
comment
Это только сделает даты жирными, я хочу изменить цвет некоторых конкретных дат - person SpongeBob SquarePants; 19.02.2011
comment
Я знаю, что это возможно для веб-календаря. Но я не уверен в Winform в 2005 году. Почему бы и не попробовать 2010? В 2010 году для C# гораздо больше возможностей. - person william; 20.02.2011
comment
Это не функция С#, это функция WinForms. И уж точно не тот, который добавляется в VS 2010 (.NET 4.0). - person Cody Gray; 20.02.2011
comment
Сорри. Я просто предполагаю. Я еще никогда не использовал 2010. Ваш ответ завораживает. Ткз.. - person william; 21.02.2011

Шаг 1: Перетащите элемент управления сетки и календарь в веб-форму или оконную форму:

шаг 2: вставьте кодировку на страницу .cs

using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Drawing;

public partial class frmCalander : System.Web.UI.Page
{
    SqlConnection con= new SqlConnection();
    SqlDataAdapter myda;
    DataSet ds = new DataSet();
    DataSet dsSelDate;
    String strConn;
    protected void Page_Load(object sender, EventArgs e)
    {
        con.ConnectionString = ConfigurationManager.ConnectionStrings["STUDENTConnectionString"].ConnectionString;
        myda = new SqlDataAdapter("Select * from EventTable", con);
        myda.Fill(ds, "Table");

    }
    protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
    {
        if (! e.Day.IsOtherMonth )
        {
                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    if ((dr["EventDate"].ToString() != DBNull.Value.ToString()))
                    {
                        DateTime dtEvent= (DateTime)dr["EventDate"];
                        if (dtEvent.Equals(e.Day.Date))
                        {
                            e.Cell.BackColor = Color.PaleVioletRed;
                        }
                    }
                }
        }
//If the month is not CurrentMonth then hide the Dates
        else
        {
                e.Cell.Text = "";
        }
    }


    protected void Calendar1_SelectionChanged(object sender, EventArgs e)
    {
        myda = new SqlDataAdapter("Select EventId, EventName, EventLocation, Convert(varchar,EventDate,105) as EventDate  from EventTable where EventDate='" + Calendar1.SelectedDate.ToString() + "'", con);
        dsSelDate = new DataSet();
        myda.Fill(dsSelDate, "AllTables");
        if (dsSelDate.Tables[0].Rows.Count == 0)
        {
            GridView1.Visible = false;
        }
        else
        {
            GridView1.Visible = true;
            GridView1.DataSource = dsSelDate;
            GridView1.DataBind();
        }

    }
person Sunny    schedule 19.02.2011
comment
Можете ли вы объяснить свой код? Я понятия не имею, что это значит - person SpongeBob SquarePants; 19.02.2011