У меня довольно простая форма: она должна всплывать, когда я нажимаю кнопку в другой форме.
Это просто календарь на месяц и кнопки ОК/Отмена.
Когда я открываю форму для в первый раз все работает отлично, я могу перемещаться вперед и назад по месяцам, могу выбирать разные дни, это действительно отзывчиво, переменная даты действительно меняется, и результаты работают правильно.
Если я нажму ОК, а затем снова открою форму чтобы выбрать другую дату, он просто сильно тормозит: стрелки для прокрутки месяцев перестают реагировать, иногда не загораются при наведении на них курсора, а мышь становится «некалиброванной», я имею в виду, мой курсор находится на одном месте, и дата, которая выбирается при щелчке левой кнопкой мыши, отличается (или вообще отсутствует).
Это мой код:
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
Проблема с зависанием WinForms MonthCalendar ⇐ C#
Место общения программистов C#
-
Anonymous
1736871241
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;
}
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79354828/problem-with-laggy-winforms-monthcalendar[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия