winform datagridview不显示滚动条
时间: 2023-09-16 13:07:22 浏览: 254
如果 WinForm 的 DataGridView 控件没有显示滚动条,可能是因为以下原因:
1. 数据不足以填满整个表格。如果数据不足以填充整个 DataGridView,则滚动条将不会显示。
2. ScrollBars 属性未设置为 AutoSize。确保 DataGridView 的 ScrollBars 属性设置为 AutoSize。这将显示垂直和水平滚动条,只有当它们需要时才会显示。
3. 控件大小不足以容纳所有数据。如果 DataGridView 控件的大小不足以容纳所有数据,则滚动条将不会显示。您可以调整控件大小,或者考虑使用分页来显示数据。
4. 数据被隐藏。如果您使用了列过滤器或行筛选器,则可能会发生数据被隐藏的情况。请检查您的筛选器设置以确保它们不会隐藏数据。
请检查以上原因,看看是否可以解决您的问题。
相关问题
winform DataGridView重绘滚动条
对于winform中的DataGridView控件,重绘滚动条的方式如下:
1. 创建一个新的滚动条,使用CreateWindow函数,指定ScrollBar类和style为WS_CHILD | WS_VISIBLE | SBS_VERT | SBS_RIGHTALIGN。
2. 让新创建的滚动条关联到DataGridView的滚动条事件,使用SetScrollInfo函数设置滚动条信息,包括滚动条范围,当前位置和页大小等等。
3. 在DataGridView的Paint事件中重绘控件,包括滚动条和数据区域。
代码示例:
```
private const uint WM_HSCROLL = 0x0114;
private const uint WM_VSCROLL = 0x0115;
private const uint SB_THUMBTRACK = 5;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
IntPtr hScrollBar;
private void dataGridView1_Resize(object sender, EventArgs e)
{
int borderWidth = SystemInformation.Border3DSize.Width;
int x = dataGridView1.Width - SystemInformation.VerticalScrollBarWidth - borderWidth;
int y = dataGridView1.Top + borderWidth;
int width = SystemInformation.VerticalScrollBarWidth;
int height = dataGridView1.Height - 2 * borderWidth;
if (hScrollBar == IntPtr.Zero)
{
hScrollBar = CreateWindow("SCROLLBAR", null, WS_CHILD | WS_VISIBLE | SBS_VERT | SBS_RIGHTALIGN, x, y, width, height, dataGridView1.Handle, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
SetScrollInfo(hScrollBar, SIF_ALL, 0, 100, 10, 0);
}
else
{
MoveWindow(hScrollBar, x, y, width, height, true);
}
}
private void dataGridView1_Scroll(object sender, ScrollEventArgs e)
{
IntPtr wParam;
if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll)
{
wParam = (IntPtr)(SB_THUMBTRACK << 16) | (IntPtr)(e.NewValue & 0xFFFF);
SendMessage(dataGridView1.Handle, WM_HSCROLL, wParam, IntPtr.Zero);
}
else if (e.ScrollOrientation == ScrollOrientation.VerticalScroll)
{
wParam = (IntPtr)(SB_THUMBTRACK << 16) | (IntPtr)(e.NewValue & 0xFFFF);
SendMessage(hScrollBar, WM_VSCROLL, wParam, IntPtr.Zero);
}
dataGridView1.Invalidate();
}
private void dataGridView1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.FillRectangle(Brushes.White, dataGridView1.ClientRectangle);
IntPtr hDC = e.Graphics.GetHdc();
SendMessage(dataGridView1.Handle, WM_PRINTCLIENT, hDC, PRF_CLIENT);
e.Graphics.ReleaseHdc(hDC);
if (hScrollBar != IntPtr.Zero)
{
hDC = e.Graphics.GetHdc();
SendMessage(hScrollBar, WM_PRINTCLIENT, hDC, PRF_CLIENT);
e.Graphics.ReleaseHdc(hDC);
}
}
```
winform DataGridView重绘滚动条样式
要重绘WinForm DataGridView的滚动条样式,需要继承DataGridView并重写它的WndProc方法。以下是一个示例代码,可以实现自定义滚动条样式:
```csharp
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class CustomDataGridView : DataGridView
{
private const int WM_PAINT = 0xF;
private const int WM_NCPAINT = 0x85;
private const int WM_NCCALCSIZE = 0x83;
private const int WM_ERASEBKGND = 0x14;
private bool isScrolling = false;
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_PAINT:
base.WndProc(ref m);
DrawScrollBar();
break;
case WM_NCPAINT:
case WM_NCCALCSIZE:
case WM_ERASEBKGND:
break;
default:
base.WndProc(ref m);
break;
}
}
private void DrawScrollBar()
{
if (!isScrolling)
{
// 获取滚动条的Graphics对象
Graphics g = this.CreateGraphics();
// 绘制滚动条背景
Rectangle bgRect = new Rectangle(this.VerticalScrollingOffset + this.Width - SystemInformation.VerticalScrollBarWidth, this.ColumnHeadersHeight, SystemInformation.VerticalScrollBarWidth, this.Height - this.ColumnHeadersHeight);
g.FillRectangle(new SolidBrush(this.BackgroundColor), bgRect);
// 绘制滚动条轨道
Rectangle trackRect = new Rectangle(bgRect.X + 1, bgRect.Y + SystemInformation.VerticalScrollBarArrowHeight, bgRect.Width - 2, bgRect.Height - 2 * SystemInformation.VerticalScrollBarArrowHeight);
ControlPaint.DrawScrollTrack(g, trackRect, ScrollOrientation.Vertical);
// 绘制滚动条滑块
Rectangle thumbRect = new Rectangle(bgRect.X + 1, bgRect.Y + SystemInformation.VerticalScrollBarArrowHeight + (this.FirstDisplayedScrollingRowIndex * trackRect.Height / this.RowCount), bgRect.Width - 2, this.DisplayedRowCount(false) * trackRect.Height / this.RowCount);
ControlPaint.DrawScrollThumb(g, thumbRect, ScrollState.Focused);
// 释放Graphics对象
g.Dispose();
}
}
protected override void OnScroll(ScrollEventArgs e)
{
isScrolling = true;
base.OnScroll(e);
isScrolling = false;
this.Invalidate(new Rectangle(this.Width - SystemInformation.VerticalScrollBarWidth, this.ColumnHeadersHeight, SystemInformation.VerticalScrollBarWidth, this.Height - this.ColumnHeadersHeight()));
}
}
```
在上述代码中,我们首先重写了DataGridView的WndProc方法,在其中处理WM_PAINT消息并调用DrawScrollBar方法绘制滚动条。DrawScrollBar方法中,我们使用CreateGraphics方法获取滚动条的Graphics对象,然后绘制滚动条背景、轨道和滑块。最后,记得在OnScroll方法中调用Invalidate方法重新绘制滚动条。
使用上述代码,我们可以实现自定义滚动条样式。需要注意的是,由于我们使用了CreateGraphics方法获取Graphics对象,因此需要在绘制完滚动条后释放该对象。此外,在绘制滑块时,我们使用了FirstDisplayedScrollingRowIndex和DisplayedRowCount方法来获取当前滚动条位置和可见行数,因此需要确保这些属性已经被正确设置。
阅读全文