2014-09-11 3 views
0

У меня есть datagridview, который кодируется в C# .net
. Мое требование: если я выберу любую ячейку DataGridView, содержимое ячейки должно быть видимым больше как всплывающее окно, или я хочу просмотреть datagridview ячейка больше или установлена, когда переместите мой курсор в определенную ячейку.Сделать выбранным DataGridView Содержимое ячейки больше

+0

Какой тип контента будет там находиться в клетках? Просто текст и цифры, а также изображения, кнопки и т. Д.? Кроме того: будет ли контент до сих пор доступен для редактирования, а расширенный? – TaW

+0

в основном содержание в тексте и картинке, а некоторые - в численном выражении ... наконец-то все типы контентов есть @TaW –

+0

Решили проблему? – TaW

ответ

0

Для текста и числовых значений это может делать то, что вам нужно:

private void dataGridView1_CellPainting(object sender, 
             DataGridViewCellPaintingEventArgs e) 
{ 
    if (e.RowIndex < 0 | e.ColumnIndex < 0) return; 
    if (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected) 
    { 
    e.Graphics.FillRectangle(SystemBrushes.Highlight, e.CellBounds); 
    e.Graphics.DrawString(e.Value.ToString(), new Font(e.CellStyle.Font.FontFamily, 
    e.CellStyle.Font.Size * 1.5f), SystemBrushes.HighlightText, e.CellBounds.Location); 
    e.Handled = true; 
    } 
} 

Вам может понадобиться использовать e.FormattedValue вместо e.Value, если вы используете форматы

Вам также может понадобиться, чтобы вставить тест из тип ячейки.

Этот код позволит увеличить шрифт на 50%, пока он не находится в режиме редактирования.

Для изображений потребуется другое решение - возможно, всплывающее ярлык или панель; но это действительно зависит только от того, что вы хотите и какими изображениями они являются. Иконки, которые я оставил бы в покое, фотографии пользователей получат прибыль от увеличенного дисплея.

Конечно, если увеличенное содержание фактически не помещается в ячейке всплывающего решения также будет называться для ..

Upadate

Вот расширение, которое проверяет столбец Value/FormattedValue и за Bitmap отображает Image во всплывающем окне Label:

Label imageLabel; 
bool labelHide = false;              //*** new 

void showImageLabel(DataGridViewCellPaintingEventArgs e) 
{ 
    if (labelHide) return;             //*** new 
    if (imageLabel == null) imageLabel = new Label(); 
    imageLabel.Click += (sender, evt) => 
         { ((Label)sender).Hide(); labelHide = true; };  //*** new 

    imageLabel.Text = ""; 
    imageLabel.Parent = dataGridView1; 
    imageLabel.Location = e.CellBounds.Location; 
    if (imageLabel.Image != null) imageLabel.Image.Dispose(); 
    //Size size = ((Bitmap)e.Value).Size;         //*** old 
    Size size = ((Bitmap)e.FormattedValue).Size;       //*** new 
    Size newSize = new Size((int)(size.Width * 1.5f), (int)(size.Height * 1.5f)); 
    //Bitmap bmp = new Bitmap((Bitmap)e.Value, newSize);     //*** old 
    Bitmap bmp = new Bitmap((Bitmap)e.FormattedValue, newSize);    //*** new 
    imageLabel.Size = newSize; 
    imageLabel.Image = bmp; 
    imageLabel.Show(); 
} 

private void dataGridView1_CellPainting(object sender, 
             DataGridViewCellPaintingEventArgs e) 
{ 
    if (e.RowIndex < 0 | e.ColumnIndex < 0) return; 
    if (e.Value == null) { if (imageLabel != null) imageLabel.Hide(); return; } 
    if (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected) 
    { 
     //if (e.Value.GetType() == typeof(Bitmap))       //*** old 
     if (e.FormattedValue.GetType() == typeof(Bitmap))     //*** new 
     { 
      showImageLabel(e); 
      e.Handled = true;            //*** old 
      if (labelHide) labelHide = false; else e.Handled = true;  //*** new 
      return; 
     } 
     else if (imageLabel != null) imageLabel.Hide(); 

     e.Graphics.FillRectangle(SystemBrushes.Highlight, e.CellBounds); 
     e.Graphics.DrawString(e.FormattedValue.ToString(), 
       new Font(e.CellStyle.Font.FontFamily, e.CellStyle.Font.Size * 1.5f), 
       SystemBrushes.HighlightText, e.CellBounds.Location); 
     e.Handled = true; 
    } 
} 

private void dataGridView1_RowLeave(object sender, DataGridViewCellEventArgs e) 
{ 
    if (imageLabel != null) imageLabel.Hide(); 
} 

Вы можете адаптировать Расположение быть, например, в центре ..

Обновления 2

Я теперь адаптировал код в случае извлечения Images непосредственно в качестве byte[] из базы данных. В этом случае Type объекта Value не является Image. Вместо этого один симплекс должен проверить FormattedValue.

Если отображаемое изображение, уменьшенное размером Image, является слишком большим, оно может охватывать все Cell, и событие Cell_Painting не будет активировано. Поэтому я также добавил однострочный код для события RowLeave, чтобы предотвратить это.

Я также добавил несколько строк, чтобы можно было щелкнуть изображение.

Пожалуйста, измените строки, отмеченные знаком // ***, добавьте событие и проверьте, работает ли он сейчас!

Вот два Скриншоты:

Image EnlargedText Enlarged

+0

ОК, я обновляю ответ всплывающим окном, которое покажет изображения, увеличенные немного позже. О каких размерах мы говорим до и после? – TaW

+0

Ну, это часто помогает узнать подробности при реализации решения. См. Мой обновленный ответ! – TaW

+0

Можете ли вы опубликовать код, который вставляет изображения в dgv? – TaW

Смежные вопросы