C # DataGridView, células grandes: Conteúdo nunca inteiramente visível, rolagem celular salta

StackOverflow https://stackoverflow.com/questions/1626879

Pergunta

Eu encontrei um problema bastante desagradável com o controle DataGridView (Windows.Forms, .NET Framework 3.0) quando há um DataGridViewCell que é maior do que o próprio DataGridView. Quando a célula grande é rolado em vista que mostra, normalmente, cortada na parte inferior, uma vez que é maior do que a vista. Se você rolar para baixo mais ele eventualmente "encaixar" na parte superior e permanece lá, até chegar a um determinado limite. Em seguida, a próxima linha será exibido na parte superior e os "grandes" desaparece linha.

Por causa do que você nunca são capazes de ver totalmente o conteúdo da célula grande.

Aqui está um código de exemplo:

using System;
using System.Windows;

namespace LoggerTextBox {
public class TestForm : Form
{
    public TestForm()
    {
        Text = "DataGridView Large Cell Example";
        SetBounds(0, 0, 300, 200, BoundsSpecified.Width | BoundsSpecified.Height);

        DataGridView dataGridView = new DataGridView();
        dataGridView.Dock = DockStyle.Fill;
        dataGridView.ScrollBars = ScrollBars.Both;
        dataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders;
        Controls.Add(dataGridView);

        DataGridViewColumn column = new DataGridViewTextBoxColumn();
        column.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        column.CellTemplate.Style.WrapMode = DataGridViewTriState.True;
        dataGridView.Columns.Add(column);

        // normal row
        DataGridViewRow row = new DataGridViewRow();
        DataGridViewCell cell = (DataGridViewTextBoxCell)column.CellTemplate.Clone();
        cell.Value = "Foo";
        row.Cells.Add(cell);
        dataGridView.Rows.AddRange(row);

        // multiline row
        row = new DataGridViewRow();
        cell = (DataGridViewTextBoxCell)column.CellTemplate.Clone();
        cell.Value =
            "Lorem ipsum dolor sit amet, consetetur sadipscing elitr," + Environment.NewLine +
            "sed diam nonumy eirmod tempor invidunt ut labore et doloreLorem," + Environment.NewLine +
            "ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy," + Environment.NewLine +
            "eirmod tempor invidunt ut labore et dolore magna aliquyam erat,," + Environment.NewLine +
            "sed diam voluptua. At vero eos et accusam et justo duo dolores et," + Environment.NewLine +
            "ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est," + Environment.NewLine +
            "Lorem ipsum dolor sit amet. magna aliquyam erat, sed diam voluptua.," + Environment.NewLine +
            "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita," + Environment.NewLine +
            "kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.";
        row.Cells.Add(cell);
        dataGridView.Rows.AddRange(row);

        // normal row
        row = new DataGridViewRow();
        cell = (DataGridViewTextBoxCell)column.CellTemplate.Clone();
        cell.Value = "Bar";
        row.Cells.Add(cell);
        dataGridView.Rows.AddRange(row);
    }

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new TestForm());
    }
}
} // namespace

Qualquer idéia de como consertar isso?

Foi útil?

Solução

Eu truncar o conteúdo de qualquer célula além de um certo tamanho (com elipses para indicar o truncamento) e permitir que a célula a ser clicado para exibir uma janela pop-up com o conteúdo completo visíveis em uma janela de rolagem. Ou eu tornaria o conteúdo dessas potencialmente grandes células em um UserControl personalizada que em si contém barras de rolagem se o texto for além de um certo comprimento.

Você está correndo em um problema que resulta da DataGridView sendo usado de forma não intencional, então eu não estou surpreso que não há simples, construído em forma de lidar com isso.

Atualizar : para visualizar registos, o ReportViewer pode ser um controle mais adequado. Aqui estão alguns links sobre a usá-lo:

http://www.codeproject.com/KB/cs/reportdisplay.aspx

http: // www .microsoft.com / downloads / details.aspx? FamilyID = f38f7037-b0d1-47a3-8063-66af555d13d9 & displaylang = en

http://www.devx.com/dotnet/Article/30424/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top