现在的问题是:如果在Form1界面设计时删除继承过的CustomDataGridView控件时,则会报"处理此命令时出错.未将对象引用设置到对象的实例",
测试如果仅注释:HorizontalScrollBar.Show();垂直滚动条可以正常显示,水平滚动条不显示.在Form1界面设计时删除也不会报错了.为什么水平滚动条的代码可以正常调用?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.Rows.Add(16);
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
}
private void button1_Click(object sender, EventArgs e)
{
dataGridView1.Rows.Add(1);
}
private void button2_Click(object sender, EventArgs e)
{
dataGridView1.Rows.RemoveAt(dataGridView1.CurrentCell.RowIndex);
}
}
public class CustomDataGridView : DataGridView
{
/// <summary>
/// Constructor,添加dataGridView1控件时,直接继承自CustomDataGridView类
/// </summary>
public CustomDataGridView() : base()
{
// 垂直滚动条
VerticalScrollBar.Visible = true;
VerticalScrollBar.VisibleChanged += new EventHandler(VerticalScrollBar_VisibleChanged);
// 水平滚动条
HorizontalScrollBar.Visible = true;
HorizontalScrollBar.VisibleChanged += new EventHandler(HorizontalScrollBar_VisibleChanged);
}
/// <summary>
/// 垂直滚动条
/// </summary>
void VerticalScrollBar_VisibleChanged(object sender, EventArgs e)
{
if (!VerticalScrollBar.Visible)
{
int width = VerticalScrollBar.Width;
VerticalScrollBar.Location = new Point(ClientRectangle.Width - width - 1, 1);
VerticalScrollBar.Size = new Size(width, ClientRectangle.Height - this.HorizontalScrollBar.Height -1);
VerticalScrollBar.Show();
}
}
/// <summary>
/// 水平滚动条
/// </summary>
void HorizontalScrollBar_VisibleChanged(object sender, EventArgs e)
{
if (!HorizontalScrollBar.Visible)
{
int height = HorizontalScrollBar.Height;
HorizontalScrollBar.Location = new Point(1, ClientRectangle.Height - height - 1);
HorizontalScrollBar.Size = new Size(ClientRectangle.Width - this.VerticalScrollBar.Width -1, height);
HorizontalScrollBar.Show();
}
}
}
}
6 个解决方案
#1
这个问题,难道就没有人会吗?真心帮助,困扰我好几天了.
#2
我试过了,虽然在Form1界面设计时删除继承过的CustomDataGridView控件时,则会报"处理此命令时出错.未将对象引用设置到对象的实例",但是这个控件是可以删掉的,而且对后面继续使用这个控件也是没有影响的。具体为什么会出现这个问题我也不清楚。
如果一定要在删除这个控件时不会报错,可以将CustomDataGridView 改为
partial class CustomDataGridView : DataGridView
{
/// <summary>
/// Constructor,添加dataGridView1控件时,直接继承自CustomDataGridView类
/// </summary>
public CustomDataGridView()
: base()
{
int width = VerticalScrollBar.Width;
VerticalScrollBar.Location = new Point(ClientRectangle.Width - width - 1, 1);
VerticalScrollBar.Size = new Size(width, ClientRectangle.Height - this.HorizontalScrollBar.Height - 1);
VerticalScrollBar.Show();
int height = HorizontalScrollBar.Height;
HorizontalScrollBar.Location = new Point(1, ClientRectangle.Height - height - 1);
HorizontalScrollBar.Size = new Size(ClientRectangle.Width - this.VerticalScrollBar.Width - 1, height);
HorizontalScrollBar.Show();
}
}
如果一定要在删除这个控件时不会报错,可以将CustomDataGridView 改为
partial class CustomDataGridView : DataGridView
{
/// <summary>
/// Constructor,添加dataGridView1控件时,直接继承自CustomDataGridView类
/// </summary>
public CustomDataGridView()
: base()
{
int width = VerticalScrollBar.Width;
VerticalScrollBar.Location = new Point(ClientRectangle.Width - width - 1, 1);
VerticalScrollBar.Size = new Size(width, ClientRectangle.Height - this.HorizontalScrollBar.Height - 1);
VerticalScrollBar.Show();
int height = HorizontalScrollBar.Height;
HorizontalScrollBar.Location = new Point(1, ClientRectangle.Height - height - 1);
HorizontalScrollBar.Size = new Size(ClientRectangle.Width - this.VerticalScrollBar.Width - 1, height);
HorizontalScrollBar.Show();
}
}
#3
按楼上的方法试过了,水平与垂直滚动条不能做到始终(无论数据是否超过显示区域)显示出来!
#4
很奇怪的需求。我感觉应该在各种Paint事件里尝试。
#5
跟你的项目具体的设置包括界面等有关系,自己好好查吧
#6
自己新增系统滚动条处理.
#1
这个问题,难道就没有人会吗?真心帮助,困扰我好几天了.
#2
我试过了,虽然在Form1界面设计时删除继承过的CustomDataGridView控件时,则会报"处理此命令时出错.未将对象引用设置到对象的实例",但是这个控件是可以删掉的,而且对后面继续使用这个控件也是没有影响的。具体为什么会出现这个问题我也不清楚。
如果一定要在删除这个控件时不会报错,可以将CustomDataGridView 改为
partial class CustomDataGridView : DataGridView
{
/// <summary>
/// Constructor,添加dataGridView1控件时,直接继承自CustomDataGridView类
/// </summary>
public CustomDataGridView()
: base()
{
int width = VerticalScrollBar.Width;
VerticalScrollBar.Location = new Point(ClientRectangle.Width - width - 1, 1);
VerticalScrollBar.Size = new Size(width, ClientRectangle.Height - this.HorizontalScrollBar.Height - 1);
VerticalScrollBar.Show();
int height = HorizontalScrollBar.Height;
HorizontalScrollBar.Location = new Point(1, ClientRectangle.Height - height - 1);
HorizontalScrollBar.Size = new Size(ClientRectangle.Width - this.VerticalScrollBar.Width - 1, height);
HorizontalScrollBar.Show();
}
}
如果一定要在删除这个控件时不会报错,可以将CustomDataGridView 改为
partial class CustomDataGridView : DataGridView
{
/// <summary>
/// Constructor,添加dataGridView1控件时,直接继承自CustomDataGridView类
/// </summary>
public CustomDataGridView()
: base()
{
int width = VerticalScrollBar.Width;
VerticalScrollBar.Location = new Point(ClientRectangle.Width - width - 1, 1);
VerticalScrollBar.Size = new Size(width, ClientRectangle.Height - this.HorizontalScrollBar.Height - 1);
VerticalScrollBar.Show();
int height = HorizontalScrollBar.Height;
HorizontalScrollBar.Location = new Point(1, ClientRectangle.Height - height - 1);
HorizontalScrollBar.Size = new Size(ClientRectangle.Width - this.VerticalScrollBar.Width - 1, height);
HorizontalScrollBar.Show();
}
}
#3
按楼上的方法试过了,水平与垂直滚动条不能做到始终(无论数据是否超过显示区域)显示出来!
#4
很奇怪的需求。我感觉应该在各种Paint事件里尝试。
#5
跟你的项目具体的设置包括界面等有关系,自己好好查吧
#6
自己新增系统滚动条处理.