Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Область отсечения по ячейке DataGridView  [new]
kab19
Member

Откуда:
Сообщений: 6
В DataGridView имеется колонка с ComboBox'ами. Необходимо задать область отсечения (Cursor.Clip) по ячейке из
этой колонки при ее редактировании. Пробовал двумя способами: через событие CellPainting и через событие Enter,
которое происходит при редактировании ComboBox'а из столбца (посредством события EditingControlShowing).

Через событие CellPainting:
        private void dataGridView3_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            if (DGV_CmbEditing)
            {
                int Left, Top, Width, Height;
                Left = this.Left + tabControl1.TabPages[1].Left + dataGridView3.Left + 811;
                Top = this.Top + this.FontHeight + tabControl1.ItemSize.Height + tabControl1.TabPages[1].Top + dataGridView3.Top + e.CellBounds.Y + 13;
                Cursor.Position = new Point(Left, Top);
                Left = this.Left + tabControl1.TabPages[1].Left + dataGridView3.Left + 600;
                Top = this.Top + this.FontHeight + tabControl1.ItemSize.Height + tabControl1.TabPages[1].Top + dataGridView3.Top + e.CellBounds.Y;
                Width = e.CellBounds.Width;
                Height = e.CellBounds.Height;
                this.Cursor = new Cursor(Cursor.Current.Handle);
                Cursor.Clip = new Rectangle(Left, Top, Width, Height);
                DGV_CmbEditing = false;
            }
        }


Через событие Enter:
        private void DGV_TextBox_Enter(object sender, EventArgs e)
        {
            ComboBox cmb_box = sender as ComboBox;
            int Left, Top, Width, Height;
            Left = this.Left + tabControl1.TabPages[1].Left + dataGridView3.Left + 600;
            Top = this.Top + this.FontHeight + tabControl1.ItemSize.Height + tabControl1.TabPages[1].Top + dataGridView3.Top + cmb_box.Bounds.Y;
            Width = cmb_box.Bounds.Width;
            Height = cmb_box.Bounds.Height;
            this.Cursor = new Cursor(Cursor.Current.Handle);
            Cursor.Clip = new Rectangle(Left, Top, Width, Height);
        }


В обоих случаях алгоритм работает, если число прибавляемое к координате Left+= 600, но координаты отсечения тогда не
попадают на нужную ячейку. Если увеличивать слагаемое до 700 и выше программа ведет себя так как будто отсечения области
курсора нет совсем.

К сообщению приложен файл. Размер - 55Kb
20 сен 21, 11:36    [22373557]     Ответить | Цитировать Сообщить модератору
 Re: Область отсечения по ячейке DataGridView  [new]
kab19
Member

Откуда:
Сообщений: 6


К сообщению приложен файл. Размер - 56Kb
20 сен 21, 11:37    [22373558]     Ответить | Цитировать Сообщить модератору
 Re: Область отсечения по ячейке DataGridView  [new]
petalvik
Member

Откуда:
Сообщений: 738
Есть экранные координаты, есть клиентские координаты. Возможно, проблема в них.
В разных местах используются те или иные. Нужно их пересчитывать по необходимости.

Смотри методы PointToScreen, RectangleToScreen, PointToClient, RectangleToClient.
20 сен 21, 16:59    [22373752]     Ответить | Цитировать Сообщить модератору
 Re: Область отсечения по ячейке DataGridView  [new]
kab19
Member

Откуда:
Сообщений: 6
petalvik,
Немного причесал код, но проблема осталась та же. Есть предположение, что проблема в том, что при редактировании ячейки DataGridView создается отдельный компонент ячейки, которая отображается поверх редактируемой и с которой работает EditingControlShowing. Как только курсор заходит на координаты новой ячейки он попадает в область нового компонента и для него перестают работать настройки курсора предыдущего компонента. Может у кого есть идеи как это исправить?

private void dataGridView3_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{           
   if (DGV_CmbEditing)
   {
	Point PointOnCell = new Point();
	PointOnCell.X = 810;
	PointOnCell.Y = this.Top + e.CellBounds.Y + 10;
	Cursor.Position = PointToScreen(PointOnCell);

	Rectangle CellRect = new Rectangle();
	CellRect.X = 600;
	CellRect.Y = this.Top + e.CellBounds.Y;
	CellRect.Width = e.CellBounds.Width;
	CellRect.Height = e.CellBounds.Height;
	this.Cursor = new Cursor(Cursor.Current.Handle);
	Cursor.Clip = RectangleToScreen(CellRect);

	DGV_CmbEditing = false;
   }
}
21 сен 21, 21:13    [22374360]     Ответить | Цитировать Сообщить модератору
 Re: Область отсечения по ячейке DataGridView  [new]
kab19
Member

Откуда:
Сообщений: 6
В дальнейшем выяснилось, что отсечение не работает вообще во всей программе и без каких либо условий. Вариант в первом сообщении работал, но не попадал в нужную ячейку. Увеличение координаты Х ведет к тому, что отсечение просто не срабатывает. Есть подозрения, что дело в настройках формы.
22 сен 21, 03:43    [22374407]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить