C # DataGridView, большие ячейки: содержимое никогда не отображается полностью, прокрутка пропускает ячейку - PullRequest
6 голосов
/ 26 октября 2009

Я столкнулся с довольно неприятной проблемой с элементом управления DataGridView (Windows.Forms, .NET Framework 3.0), когда DataGridViewCell больше, чем сам DataGridView. Когда большая ячейка прокручивается в поле зрения, она отображается нормально, обрезается внизу, поскольку она больше, чем вид. Если вы прокрутите вниз дальше, он в конечном итоге «защелкнется» сверху и останется там, пока не достигнете определенного порога. Затем следующий ряд будет отображаться вверху, а «большой» ряд исчезает.

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

Вот пример кода:

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

Есть идеи, как это исправить?

1 Ответ

1 голос
/ 26 октября 2009

Я бы обрезал содержимое любой ячейки до определенного размера (с эллипсами для обозначения усечения) и позволил бы щелкнуть ячейку, чтобы отобразить всплывающее окно с полным содержимым, видимым в прокручиваемом окне. Или я бы отобразил содержимое этих потенциально больших ячеек в пользовательском элементе управления UserControl, который сам содержит полосы прокрутки, если текст превышает определенную длину.

Вы столкнулись с проблемой, которая возникает из-за непреднамеренного использования DataGridView, поэтому я не удивлен, что не существует простого, встроенного способа решения этой проблемы.

Обновление : для просмотра журналов ReportViewer может быть более подходящим элементом управления. Вот несколько ссылок на его использование:

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/

...