C#DataGridView,大单元格:内容永远不完全可见,滚动跳过单元格
我在C#DataGridView,大单元格:内容永远不完全可见,滚动跳过单元格,c#,.net,winforms,datagridview,scrollbar,C#,.net,Winforms,Datagridview,Scrollbar,我在DataGridView控件(Windows.Forms、.netframework3.0)中遇到了一个相当严重的问题,因为DataGridViewCell大于DataGridView本身。当大单元格滚动到视图中时,它会正常显示,在底部被截断,因为它比视图大。如果你进一步向下滚动,它最终会在顶部“捕捉”并停留在那里,直到你达到某个阈值。然后,下一行将显示在顶部,“大”行消失 因此,您永远无法完全看到大单元格的内容 下面是一个示例代码: using System; using System.W
DataGridView
控件(Windows.Forms、.netframework3.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
使用系统;
使用System.Windows;
命名空间日志文本框{
公共类TestForm:Form
{
公共测试表单()
{
Text=“DataGridView大单元格示例”;
立根(0,0,300,200,指定边界。宽度|指定边界。高度);
DataGridView DataGridView=新建DataGridView();
dataGridView.Dock=DockStyle.Fill;
dataGridView.ScrollBars=滚动条。两者都是;
dataGridView.AutoSizeRowsMode=DataGridViewAutoSizeRowsMode.AllCellsCeptheaders;
添加(dataGridView);
DataGridViewColumn=新DataGridViewTextBoxColumn();
column.AutoSizeMode=DataGridViewAutoSizeColumnMode.Fill;
column.CellTemplate.Style.WrapMode=DataGridViewTriState.True;
dataGridView.Columns.Add(column);
//正常行
DataGridViewRow行=新建DataGridViewRow();
DataGridViewCell单元格=(DataGridViewTextBoxCell)列.CellTemplate.Clone();
cell.Value=“Foo”;
行.单元格.添加(单元格);
dataGridView.Rows.AddRange(行);
//多行行
行=新的DataGridViewRow();
cell=(DataGridViewTextBoxCell)column.CellTemplate.Clone();
单元格值=
“Lorem ipsum dolor sit amet,Consettur sadipscing Eliter,”+Environment.NewLine+
“在劳动和福利方面暂时不受限制,”+Environment.NewLine+
“ipsum dolor sit amet,Conseteteur sadipscing Eliter,sed diam nonumy,”+Environment.NewLine+
“埃尔莫临时劳工和劳工局局长,环境部,”+Environment.NewLine+
“sed diam voluptua.在vero eos et accusam et justo duo dolores et,”+Environment.NewLine+
“ea rebum.Stet clita kasd gubergren,无海takimata sanctus est,”+Environment.NewLine+
“Lorem ipsum dolor sit amet.magna aliquyam erat,sed diam voluptua.,”+Environment.NewLine+
“在vero eos和accusam和justo duo dolores和ea rebum.Stet clita,”+Environment.NewLine+
“卡斯德·古伯格伦(kasd gubergren),没有海洋——塔基马塔圣所(takimata sanctus)是一个知识渊博的地方;
行.单元格.添加(单元格);
dataGridView.Rows.AddRange(行);
//正常行
行=新的DataGridViewRow();
cell=(DataGridViewTextBoxCell)column.CellTemplate.Clone();
cell.Value=“Bar”;
行.单元格.添加(单元格);
dataGridView.Rows.AddRange(行);
}
///
///应用程序的主要入口点。
///
[状态线程]
静态void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
运行(新的TestForm());
}
}
}//名称空间
知道如何解决这个问题吗?我会将任何单元格的内容截断到超过一定大小(用省略号表示截断),并允许单击该单元格以显示一个弹出窗口,在可滚动窗口中显示完整内容。或者,如果文本超过一定长度,我会在自定义UserControl中呈现这些潜在大单元格的内容,该自定义UserControl本身包含滚动条 您遇到了一个问题,这是由于DataGridView被意外地使用而导致的,因此没有简单的、内置的方法来处理这一问题并不奇怪 更新:要查看日志,
ReportViewer
可能是一个更合适的控件。以下是有关使用它的一些链接:
我需要比文本框更复杂的东西来记录日志(准确地说是显示日志输出),我认为DataGridView(绑定到日志项列表)是个好主意。我现在绕过了这个滚动问题,事先将消息分成几行。不完全是我想要的,因为这会带来其他问题,但是。。。可以谢谢@马库斯:你所有的日志都是用拉丁语写的吗?:)@马库斯:我建议把你的问题作为另一个问题来问,看看人们的建议。类似于“在winforms应用程序中显示(可能很长)日志项的最佳控件是什么?”我自己真的想不出一个好的答案。我可能最终会为此编写一个完整的自定义控件,但这可能需要大量的工作。@MusiGenesis只有在有时,如果我的同事不注意的话。:)我将看一看ReportViewer,但它对我来说似乎不是“最佳”解决方案。(问题是,我正在查看网络中不同节目的状态输出,这些节目将在“直播”中播出。)问另一个问题可能是个好主意。(只是每个人似乎都在回答“列表框”,这并不是我所需要的:)@Markus:确保你在你的问题中写上“我不能用列表框来做这个”。