Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Пиксельные координаты DataGridViewCell


Автор: Linus 7.12.2006, 20:01
Здравствуйте, люди добрые. Прошу руку помощи. У меня имеется DataGridView, в котором есть столбец (DataGridViewTextBoxColumn) и очень надо на месте одной из ячеек поместить ComboBox. Так как изменить тип одной ячейки этой колонки я не смог, то подумал, что можно просто создать Combobox на месте этой одной ячейки. Только тут опять неприятности. Я не знаю, как найти координаты ячейки DataGridView (чтобы налепить на это место Combobox). В самом DataGridView используются полосы прокрутки (т.е. комбобокс тоже должен "летать" вместе с остальными ячейками грида при прокрутке). Помогите кто чем может, как это реализовать...

Автор: Dmitriy_Donetsk 8.12.2006, 00:17
Linux,

Цитата

Здравствуйте, люди добрые. Прошу руку помощи. У меня имеется DataGridView, в котором есть столбец (DataGridViewTextBoxColumn) и очень надо на месте одной из ячеек поместить ComboBox. Так как изменить тип одной ячейки этой колонки я не смог, то подумал, что можно просто создать Combobox на месте этой одной ячейки. Только тут опять неприятности. Я не знаю, как найти координаты ячейки DataGridView (чтобы налепить на это место Combobox). В самом DataGridView используются полосы прокрутки (т.е. комбобокс тоже должен "летать" вместе с остальными ячейками грида при прокрутке). Помогите кто чем может, как это реализовать... 



Вот довольно простой способ, как в любой ячейке DataGridView (в моем случае 0,0) поместить 
ComboBox:

Код

DataGridViewComboBoxCell ComboTextCell = new DataGridViewComboBoxCell();
            ComboTextCell.Items.Clear();
            ComboTextCell.Items.Add("Forum");
            ComboTextCell.Items.Add("Vingrad");
   
            dataGridView1[0, 0] = ComboTextCell;


И комбобокс "летает"  smile 

Автор: Linus 8.12.2006, 05:26
Dmitriy_Donetsk, спасибо Вам огромное, помогло, именно то, что надо  smile  А вообще можно-ли как-то узнать координаты какой-либо ячейки (то есть при редактировании некоторых ячеек на событие BeginEdit чтобы выскакивало маленькое окошко рядом с редактируемой ячейкой для ввода разных параметров, которые потом переведутся в строку и запишутся в ячейку)

Автор: Dmitriy_Donetsk 8.12.2006, 22:21
Linux,

Извеняюсь за поздний ответ, итак...

Координаты dataGridView по которым вы кликнули мышкой можно получить:

Код

private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
        {
            //Создаем "точку" - экземпляр класса System.Drawing.Point объект pt (которому передаются координаты нажатия мышки) 
            System.Drawing.Point pt = new Point(e.X, e.Y);
            if ((e.X>=100) && (e.X<=200))
            {
                // Реализуем код, который показывает окошко, используя эти координаты (e.X и e.Y)
            }

          
        }


Я так понимаю что вам подходит именно этот вариант, но можно еще использовать событие CellClick

Код

 private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if ((e.ColumnIndex == 0) && (e.RowIndex == 1))
                MessageBox.Show("!!!");

        }



Теперь каждой клетке dataGridView вы можете назначить свой обработчик события smile 


Автор: Linus 9.12.2006, 00:41
Dmitriy_Donetsk, а если для редактирования ячейки пользователь не будет использовать мышь? Например, просто нажмёт на ячейке пробел. То есть как узнать координаты именно редактируемой ячейки, чтобы используя эти координаты рассчитать Location окошка, которое выскочет? Сколько я уже не смотрел различных свойств, нигде этого и не нашёл...  smile 

Заранее благодарен

Автор: Linus 9.12.2006, 13:49
Ура, я нашёл! Так близко лежало, а я так долго искал) 

Код

private void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e)
        {
            Rectangle rect  = form.dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
            MessageBox.Show("X: " + rect.X.ToString() + " Y: " + rect.Y.ToString());
            ......................................................................................
         }


Dmitriy_Donetsk, большое Вам спасибо за помощь  smile 

Автор: Dmitriy_Donetsk 9.12.2006, 13:59
Linus,

Цитата

Dmitriy_Donetsk, а если для редактирования ячейки пользователь не будет использовать мышь? Например, просто нажмёт на ячейке пробел. То есть как узнать координаты именно редактируемой ячейки, чтобы используя эти координаты рассчитать Location окошка, которое выскочет? Сколько я уже не смотрел различных свойств, нигде этого и не нашёл...   


Если мы редактируем клетку в DataGridView, то единственное что мы можем получить это координаты этой клетки (номер строки и столбца); Прийдется ручками подгонять Location формы под эти номера. Используем свойство CellBeginEdit.

Создаем новую форму Form2, устанавл. свойство FormBorderStyle в None. (эта форма будет выскакивать рядом с редактируемой клеткой)

Код

 private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {
            //MessageBox.Show(e.RowIndex.ToString());
           // MessageBox.Show(e.ColumnIndex.ToString());
        
            {
                Form2 form2 = new Form2();
                form2.Left = e.ColumnIndex * 100; 
                form2.Top = e.RowIndex*100;
               //Грубо говоря, нужно правильно подогнать координаты
                form2.ShowDialog(); 
            }
        }



Насколько я понимаю, это то, что вам требовалось, хотя как-то это сложно. не проще ли просто 
сделать каждую Cell в dataGridView Комбобоксом со своими значениями?

Для быстроты можно использовать не DataGridViewComboBoxCell, а DataGridViewComboBoxColumn.

Добавлено @ 14:07 
Linus,

Цитата

Ура, я нашёл! Так близко лежало, а я так долго искал) 


Congratulations  smile  Ваш способ действительно проще.

Автор: Linus 9.12.2006, 14:28
Цитата

Насколько я понимаю, это то, что вам требовалось, хотя как-то это сложно. не проще ли просто 
сделать каждую Cell в dataGridView Комбобоксом со своими значениями?
Для быстроты можно использовать не DataGridViewComboBoxCell, а DataGridViewComboBoxColumn.


Мне нужно было, чтобы столбец имел тип DataGridViewTextBoxColumn, и только одна ячейка в нём была комбобоксом, и ещё, чтобы при редактировании определённых ячеек у меня выскакивало окошко для ввода 4-х чисел A,B,C,D (в окошке 4 TextBox), а после выхода из этого окна чтобы в редактируемую ячейку вывелась строка в формате A; B; C; D  ("3.14; 15; 168; 123.65").

Теперь всё работает, thanx  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)