Проблема с зависанием WinForms MonthCalendarC#

Место общения программистов C#
Ответить
Anonymous
 Проблема с зависанием WinForms MonthCalendar

Сообщение Anonymous »

У меня довольно простая форма: она должна всплывать, когда я нажимаю кнопку в другой форме.
Это просто календарь на месяц и кнопки ОК/Отмена.
Когда я открываю форму для в первый раз все работает отлично, я могу перемещаться вперед и назад по месяцам, могу выбирать разные дни, это действительно отзывчиво, переменная даты действительно меняется, и результаты работают правильно.
Если я нажму ОК, а затем снова открою форму чтобы выбрать другую дату, он просто сильно тормозит: стрелки для прокрутки месяцев перестают реагировать, иногда не загораются при наведении на них курсора, а мышь становится «некалиброванной», я имею в виду, мой курсор находится на одном месте, и дата, которая выбирается при щелчке левой кнопкой мыши, отличается (или вообще отсутствует).
Это мой код:
public partial class CalendarForm : Form
{
private DateTime selectedDate;
private bool isDateSelected;

public CalendarForm(DateTime initialDate)
{
InitializeComponent();
InitializeCustomComponents(initialDate);
}

private void InitializeCustomComponents(DateTime initialDate)
{
this.FormBorderStyle = FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
CultureInfo ci = new CultureInfo("es-ES");
monthCalendar.TitleBackColor = System.Drawing.Color.LightBlue;
monthCalendar.TitleForeColor = System.Drawing.Color.White;
monthCalendar.TrailingForeColor = System.Drawing.Color.Gray;
monthCalendar.FirstDayOfWeek = Day.Monday;
monthCalendar.CalendarDimensions = new System.Drawing.Size(1, 1);
monthCalendar.TodayDate = initialDate;
monthCalendar.SelectionStart = initialDate;
monthCalendar.SelectionEnd = initialDate;
btnOK.Click += BtnOK_Click;
btnCancel.Click += BtnCancel_Click;
}

private void BtnOK_Click(object sender, EventArgs e)
{
selectedDate = monthCalendar.SelectionStart;
isDateSelected = true;
this.DialogResult = DialogResult.OK;
}

private void BtnCancel_Click(object sender, EventArgs e)
{
isDateSelected = false;
this.DialogResult = DialogResult.Cancel;
}

public (DateTime, bool) GetSelectedDate()
{
return (selectedDate, isDateSelected);
}
}

и вот здесь форма называется:
private async void btnCalendar_Click(object sender, EventArgs e)
{
bool updated = false;
using (CalendarForm calendarForm = new CalendarForm(selectedDate))
{
if (calendarForm.ShowDialog() == DialogResult.OK)
{
(DateTime date, bool isDateSelected) = calendarForm.GetSelectedDate();
if (isDateSelected)
{
selectedDate = date;
updated = true;
}
}
}
if (updated)
{
await LoadDataForDate(selectedDate);
}

}

Есть идеи, что происходит? Что я делаю не так?
В соответствии с запросами, вот LoadDataForDate():
private async Task LoadDataForDate(DateTime date)
{
string dateString = date.ToString("yyyyMMdd");
basketLayers = await Task.Run(() => Backend.GetHeatData(dateString, globalversion, 0));

DataTable heatBasketTable = CreateHeatBasketDataTable(basketLayers);
dataGridViewHeatBaskets.DataSource = heatBasketTable;

DataTable basketLayerTable = CreateBasketLayerDataTable(basketLayers);
dataGridViewBasketLayers.DataSource = basketLayerTable;

SetColumnHeaders(1);

lblSelectedDate.Text = date.ToString("yyyy-MM-dd");

MakeHeadersNonClickable(dataGridViewBasketLayers);
MakeHeadersNonClickable(dataGridViewHeatBaskets);

dataGridViewBasketLayers.DataBindingComplete += DataGridViewBasketLayers_DataBindingComplete;
}

и GetHeatData. Для обеспечения конфиденциальности я буду использовать смесь кода и псевдокода:
public static async Task GetHeatData(string date)
{
List basketLayers = new List();

using (SqlConnection localcnn = new SqlConnection(_connetionString))
{
await localcnn.OpenAsync();
StringBuilder sb = new StringBuilder();
sb.AppendLine("some stuff, using the date argument");
SqlCommand comando = new SqlCommand(sb.ToString(), localcnn);
SqlDataReader reader = await comando.ExecuteReaderAsync();

while (await reader.ReadAsync())
{
int someVariables = int.Parse(reader.GetString(reader.GetOrdinal("SQLvariables")));

BasketLayer basketLayer = new BasketLayer(someFields);
basketLayers.Add(basketLayer);
}
reader.Close();
}

Dictionary basketOffsetDict = new Dictionary();
foreach (var basketLayer in basketLayers)
{
//a small routine to update a class field
basketOffset = CheckForOlderBaskets(somevariables); //this should be async because it's an SQL I/O
basketLayer.Basket += basketOffset;
}
return basketLayers;
}

и отписка от мероприятия:
private void DataGridViewBasketLayers_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
ReadOnlyData();
dataGridViewBasketLayers.DataBindingComplete -= DataGridViewBasketLayers_DataBindingComplete;
}


и ReadOnlyData()
private void ReadOnlyData()
{
foreach (DataGridViewColumn column in dataGridViewHeatBaskets.Columns)
{
column.ReadOnly = true;
}

if (globalversion == "original")
{
foreach (DataGridViewColumn column in dataGridViewBasketLayers.Columns)
{
column.ReadOnly = true;
}
}
else if (globalversion == "update")
{
dataGridViewBasketLayers.Columns["Col1"].ReadOnly = true;
dataGridViewBasketLayers.Columns["Col2"].ReadOnly = true;
dataGridViewBasketLayers.Columns["Col3"].ReadOnly = true;
dataGridViewBasketLayers.Columns["Col4"].ReadOnly = true;

foreach (DataGridViewRow row in dataGridViewBasketLayers.Rows)
{
if (!RowHasValues(row))
{
row.Cells["Col5"].ReadOnly = true;
}
else
{
row.Cells["Col5"].ReadOnly = false;
}
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... thcalendar
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»