关于重写DataGridView控件,添加滚动条事件

时间:2022-02-16 17:10:04
代码如下,很简单地的功能:就是继承DataGridView控件,让其始终显示水平与垂直滚动条,但是否可用则由相应的数据集来控制.
现在的问题是:如果在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();
        }
}

#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();
        }
}

#3


按楼上的方法试过了,水平与垂直滚动条不能做到始终(无论数据是否超过显示区域)显示出来!

#4


很奇怪的需求。我感觉应该在各种Paint事件里尝试。

#5


跟你的项目具体的设置包括界面等有关系,自己好好查吧

#6


自己新增系统滚动条处理.