显示、隐藏DataGridView的列

来源:互联网 发布:鸡鸣狗吠 兄嫂当知之 编辑:程序博客网 时间:2024/06/11 18:27

最近闲来无事,就做了个自定义显示隐藏DataGridView列的控件。如下图,左边是隐藏字段,右边是显示的字段,可以上下排序、置顶置底,保存之后DataGridView会按照以选择的字段顺序调整列的先后顺序。双击字段可以移除到列一个列表中去,可以相互拖拽等功能,右键菜单有全选、取消等操作。就是上下排序的时候不能实现多选,希望各位大神看看能不能帮我解决一下这个问题,在此谢过了。好了,废话不多说了,代码贴上:

2011-09-05 升级说明:增加显示字段的保存。以选字段会保存下来,关闭后下次在打开DataGridView会按照您上次的排序及算则的字段进行排序

 

 

 

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Collections;using System.IO;namespace PrintStock{    public partial class ShowField : Form    {        private Hashtable _yestable;        private Hashtable _notable;        private PrintStockList _queryResult;        public Hashtable YesTable        {            get { return _yestable; }            set { _yestable = value; }        }        public Hashtable NoTable        {            get { return _notable; }            set { _notable = value; }        }        public PrintStockList QQueryResult        {            get { return _queryResult; }            set { _queryResult = value; }        }        public  ShowField()        {            InitializeComponent();        }        ContextMenuStrip contentMenu1;        ContextMenuStrip contentMenu2;        /// <summary>        ///         /// </summary>        /// <param name="yestable"></param>        /// <param name="notable"></param>        /// <param name="queryResult"></param>        public ShowField(Hashtable yestable, Hashtable notable, PrintStockList queryResult)        {            InitializeComponent();            _yestable = yestable;            _notable = notable;            _queryResult = queryResult;        }        private void ShowField_Load(object sender, EventArgs e)        {            //遍历hashtable 分别加载到两个listview            IDictionaryEnumerator myEnumerator = YesTable.GetEnumerator();            while (myEnumerator.MoveNext())            {                listView2.Items.Insert(0, new ListViewItem(myEnumerator.Value.ToString()));            }            IDictionaryEnumerator myEnumeratorNo = NoTable.GetEnumerator();            while (myEnumeratorNo.MoveNext())            {                listView1.Items.Insert(0, new ListViewItem(myEnumeratorNo.Value.ToString()));            }            //添加悬浮提示            ToolTip tt = new ToolTip();            tt.InitialDelay = 200;            tt.AutomaticDelay = 200;            tt.ReshowDelay = 200;            tt.ShowAlways = true;            tt.SetToolTip(pictureBox_down, "下移选中字段(已选择字段列表)");            tt.SetToolTip(pictureBox_downdown, "置底选中字段(已选择字段列表)");            tt.SetToolTip(pictureBox_left, "左移选中字段");            tt.SetToolTip(pictureBox_right, "右移选中字段");            tt.SetToolTip(pictureBox_up, "上移选中字段(已选择字段列表)");            tt.SetToolTip(pictureBox_upup, "置顶选中字段(已选择字段列表)");            tt.SetToolTip(listView1, "双击从未选择字段列表中移除");            tt.SetToolTip(listView2, "双击从已选择字段列表中移除");            contentMenu1 = new ContextMenuStrip();            contentMenu1.Items.Add("全选");            contentMenu1.Items.Add("全不选");            contentMenu1.Items.Add("反选");            contentMenu1.Items[0].Click+=new EventHandler(contentMenu1_CheckAll);                        contentMenu1.Items[1].Click += new EventHandler(contentMenu1_CheckNo);            contentMenu1.Items[2].Click+=new EventHandler(contentMenu1_Inverse);                        contentMenu2 = new ContextMenuStrip();            contentMenu2.Items.Add("全选");            contentMenu2.Items.Add("全不选");            contentMenu2.Items.Add("反选");            contentMenu2.Items[0].Click += new EventHandler(contentMenu2_CheckAll);            contentMenu2.Items[1].Click += new EventHandler(contentMenu2_CheckNo);            contentMenu2.Items[2].Click += new EventHandler(contentMenu2_Inverse);                        listView1.ContextMenuStrip = contentMenu1;            listView2.ContextMenuStrip = contentMenu2;        }        private void contentMenu1_CheckAll(object sender, EventArgs e)        {            foreach (ListViewItem item in listView1.Items)                item.Selected = true;        }        private void contentMenu1_CheckNo(object sender, EventArgs e)        {            foreach (ListViewItem item in listView1.Items)                item.Selected = false;        }        private void contentMenu1_Inverse(object sender, EventArgs e)        {            foreach (ListViewItem item in listView1.Items)            {                if (item.Selected == true)                    item.Selected = false;                else                    item.Selected = true;            }                    }        private void contentMenu2_CheckAll(object sender, EventArgs e)        {            foreach (ListViewItem item in listView2.Items)                item.Selected = true;        }        private void contentMenu2_CheckNo(object sender, EventArgs e)        {            foreach (ListViewItem item in listView2.Items)                item.Selected = false;        }        private void contentMenu2_Inverse(object sender, EventArgs e)        {            foreach (ListViewItem item in listView2.Items)            {                if (item.Selected == true)                    item.Selected = false;                else                    item.Selected = true;            }        }        private void listView1_DoubleClick(object sender, EventArgs e)        {            //获取listview1当前焦点            ListViewItem item = listView1.FocusedItem;            listView1.Items.Remove(item);            listView2.Items.Add(item);            listView1.SelectedItems.Clear();            listView2.SelectedItems.Clear();        }        private void listView2_DoubleClick(object sender, EventArgs e)        {            ListViewItem item = listView2.FocusedItem;            listView2.Items.Remove(item);            listView1.Items.Add(item);            listView1.SelectedItems.Clear();            listView2.SelectedItems.Clear();        }        private void pictureBox_left_Click(object sender, EventArgs e)        {            if (listView2.SelectedItems.Count > 0)            {                foreach (ListViewItem lvi in listView2.SelectedItems)                {                    lvi.Remove();                    listView1.Items.Add(lvi);                    listView1.SelectedItems.Clear();                    listView2.SelectedItems.Clear();                }            }        }        private void pictureBox_right_Click(object sender, EventArgs e)        {            if (listView1.SelectedItems.Count > 0)            {                foreach (ListViewItem lvi in listView1.SelectedItems)                {                    lvi.Remove();                    listView2.Items.Add(lvi);                    listView1.SelectedItems.Clear();                    listView2.SelectedItems.Clear();                }            }        }        private void pictureBox_upup_Click(object sender, EventArgs e)        {            if (listView2.Items.Count > 0)            {                if (listView2.SelectedItems.Count > 1)                {                    MessageBox.Show("此操作不支持多选!", "产权交易所股权登记系统", MessageBoxButtons.OK, MessageBoxIcon.Information);                    return;                }                ActiveControl = listView2;                int selected = listView2.FocusedItem.Index;                ListViewItem item = listView2.FocusedItem;                if (selected != 0)                {                    listView2.Items.Remove(item);                    listView2.Items.Insert(0, item);                    listView2.Items[selected].Selected = false;                    listView2.Items[selected].Focused = false;                    listView2.Items[0].Selected = true;                    listView2.Items[0].Focused = true;                }            }        }        private void pictureBox_up_Click(object sender, EventArgs e)        {            if (listView2.Items.Count > 0)            {                if (listView2.SelectedItems.Count > 1)                {                    MessageBox.Show("此操作不支持多选!", "产权交易所股权登记系统", MessageBoxButtons.OK, MessageBoxIcon.Information);                    return;                }                ActiveControl = listView2;                int selected = listView2.FocusedItem.Index;                ListViewItem item = listView2.FocusedItem;                if (selected != 0)                {                    listView2.Items.Remove(item);                    listView2.Items.Insert(selected - 1, item);                    listView2.Items[selected].Focused = false;                    listView2.Items[selected].Selected = false;                    listView2.Items[selected - 1].Focused = true;                    listView2.Items[selected - 1].Selected = true;                }            }        }        private void pictureBox_down_Click(object sender, EventArgs e)        {            if (listView2.Items.Count > 0)            {                if (listView2.SelectedItems.Count > 1)                {                    MessageBox.Show("此操作不支持多选!", "产权交易所股权登记系统", MessageBoxButtons.OK, MessageBoxIcon.Information);                    return;                }                ActiveControl = listView2;                int selected = listView2.FocusedItem.Index;                ListViewItem item = listView2.FocusedItem;                if (selected != listView2.Items.Count - 1)                {                    listView2.Items.Remove(item);                    listView2.Items.Insert(selected + 1, item);                    listView2.Items[selected].Selected = false;                    listView2.Items[selected].Focused = false;                    listView2.Items[selected + 1].Selected = true;                    listView2.Items[selected + 1].Focused = true;                }            }        }        private void pictureBox_downdown_Click(object sender, EventArgs e)        {            if (listView2.Items.Count > 0)            {                if (listView2.SelectedItems.Count > 1)                {                    MessageBox.Show("此操作不支持多选!", "产权交易所股权登记系统", MessageBoxButtons.OK, MessageBoxIcon.Information);                    return;                }                ActiveControl = listView2;                ListViewItem item = listView2.FocusedItem;                int selected = this.listView2.FocusedItem.Index;                if (selected != listView2.Items.Count - 1)                {                    listView2.Items.Remove(item);                    listView2.Items.Add( item);                    listView2.Items[selected].Focused = false;                    listView2.Items[selected].Selected = false;                    listView2.Items[listView2.Items.Count - 1].Focused = true;                    listView2.Items[listView2.Items.Count - 1].Selected = true;                }            }        }        private void btnOK_Click(object sender, EventArgs e)        {            string shou = string.Empty;            for (int m = 0; m < listView2.Items.Count; m++)            {                shou += listView2.Items[m].Text + ",";            }            if (shou == "")            {                MessageBox.Show("不能隐藏所有列!", "产权交易所股权登记系统", MessageBoxButtons.OK, MessageBoxIcon.Warning);                return;            }            shou = shou.Substring(0,shou.Length-1);            try            {                Write_Data_For_ShowField(QQueryResult.Name,shou);            }            catch            {                MessageBox.Show("出现错误!", "产权交易所股权登记系统", MessageBoxButtons.OK, MessageBoxIcon.Warning);            }            for (int j = 0; j < QQueryResult.dataGridView1.Columns.Count; j++)            {                for (int i = 0; i < listView1.Items.Count; i++)                {                    if (listView1.Items[i].Text == QQueryResult.dataGridView1.Columns[j].HeaderText)                        QQueryResult.dataGridView1.Columns[j].Visible = false;                }                for (int k = 0; k < listView2.Items.Count; k++)                {                    if (listView2.Items[k].Text == QQueryResult.dataGridView1.Columns[j].HeaderText)                    {                        QQueryResult.dataGridView1.Columns[j].Visible = true;                        QQueryResult.dataGridView1.Columns[QQueryResult.dataGridView1.Columns[j].HeaderText].DisplayIndex = listView2.Items[k].Index;                    }                }            }            //for (int j = 0; j < QQueryResult.dataGridView1.Columns.Count; j++)            //{            //    for (int i = 0; i < listView2.Items.Count; i++)            //    {            //        if (listView1.Items[i].Text == QQueryResult.dataGridView1.Columns[j].HeaderText)            //        {            //            QQueryResult.dataGridView1.Columns[j].Visible = true;            //        }            //    }            //            this.Close();        }        private void Write_Data_For_ShowField(string name,string content)        {            using (FileStream FS = File.Create(Application.StartupPath + "//"+name+".ini"))            {                FS.Close();            }            using (StreamWriter write_string = File.CreateText(Application.StartupPath + "//" + name + ".ini"))            {                write_string.Write(Secret.Fun_Secret(content));                write_string.Close();            }        }                private void btn_cancel_Click(object sender, EventArgs e)        {            this.Close();        }        private void listView1_ItemDrag(object sender, ItemDragEventArgs e)        {            ListViewItem[] items = new ListViewItem[((ListView)(sender)).SelectedItems.Count];            int i = 0;            foreach (ListViewItem item in ((ListView)(sender)).SelectedItems)            {                items[i] = item;                i++;            }            ((ListView)(sender)).DoDragDrop(new DataObject("System.Windows.Forms.ListViewItem()", items), DragDropEffects.Copy);             }        private void listView2_DragEnter(object sender, DragEventArgs e)        {            if (e.Data.GetDataPresent("System.Windows.Forms.ListViewItem()"))            {                                e.Effect = DragDropEffects.Copy;            }            else            {                e.Effect = DragDropEffects.None;            }        }        private void listView2_DragDrop(object sender, DragEventArgs e)        {            ListViewItem[] items = (ListViewItem[])(e.Data.GetData("System.Windows.Forms.ListViewItem()"));            int i = 0;            foreach (ListViewItem item in items)            {                ListViewItem listitem = new ListViewItem(items[i].Text, item.ImageIndex);                listitem.SubItems.Add(items[i].SubItems[i].Text);                ((ListView)(sender)).Items.Add(listitem);                try                {                    if (sender == listView2)                        listView1.Items.Remove(listView1.SelectedItems[i]);                }                catch (Exception ex)                {                    MessageBox.Show(ex.Message.ToString(), "产权交易所股权登记系统", MessageBoxButtons.OK, MessageBoxIcon.Error);                    return;                }                i++;            }        }        private void listView2_ItemDrag(object sender, ItemDragEventArgs e)        {            ListViewItem[] items=new ListViewItem[((ListView)(sender)).SelectedItems.Count];            int i = 0;            foreach (ListViewItem item in ((ListView)(sender)).SelectedItems)            {                items[i] = item;                i++;            }            ((ListView)(sender)).DoDragDrop(new DataObject("System.Windows.Forms.ListViewItem()", items), DragDropEffects.Copy);        }        private void listView1_DragEnter(object sender, DragEventArgs e)        {            if (e.Data.GetDataPresent("System.Windows.Forms.ListViewItem()"))            {                e.Effect = DragDropEffects.Copy;            }            else            {                e.Effect = DragDropEffects.None;            }        }        private void listView1_DragDrop(object sender, DragEventArgs e)        {            ListViewItem[] items = (ListViewItem[])(e.Data.GetData("System.Windows.Forms.ListViewItem()"));            int i = 0;            foreach (ListViewItem item in items)            {                ListViewItem listitem = new ListViewItem(items[i].Text, item.ImageIndex);                listitem.SubItems.Add(items[i].SubItems[i].Text);                ((ListView)(sender)).Items.Add(listitem);                try                {                    if (sender == listView1)                        listView2.Items.Remove(listView2.SelectedItems[i]);                }                catch (Exception ex)                {                    MessageBox.Show(ex.Message.ToString(), "产权交易所股权登记系统", MessageBoxButtons.OK, MessageBoxIcon.Error);                }                i++;            }        }            }}

 


调用方法如下:

private void 显示字段ToolStripMenuItem_Click(object sender, EventArgs e)        {            if (dataGridView1.RowCount > 0)            {                Hashtable yestable = new Hashtable();                Hashtable notable = new Hashtable();                for (int i = 0; i < dataGridView1.Columns.Count; i++)                {                    if (dataGridView1.Columns[i].Visible)                    {                        yestable.Add(dataGridView1.Columns[i].DisplayIndex, dataGridView1.Columns[i].HeaderText);                    }                    else                    {                        notable.Add(dataGridView1.Columns[i].DisplayIndex, dataGridView1.Columns[i].HeaderText);                    }                }                ShowField shouField = new ShowField(yestable, notable, this);                shouField.ShowDialog();            }        }
 if (File.Exists(Application.StartupPath + "//" + this.Name + ".ini"))                    {                        string[] temp_data = new string[1000];                        temp_data = File.ReadAllLines(Application.StartupPath + "//" + this.Name + ".ini", Encoding.UTF8);                        if (temp_data.Length > 0)                        {                            string[] shou = Secret.Fun_UnSecret(temp_data[0]).Split(',');                            for (int j = 0; j < dataGridView1.Columns.Count; j++)                            {                                dataGridView1.Columns[j].Visible = false;                                for (int i = 0; i < shou.Length; i++)                                {                                    if (dataGridView1.Columns[j].HeaderText == shou[i].ToString())                                    {                                        dataGridView1.Columns[j].Visible = true;                                        dataGridView1.Columns[dataGridView1.Columns[j].HeaderText].DisplayIndex = i;                                    }                                }                            }                        }                                            }                    else                    {                        dataGridView1.Columns[10].Visible = false;                        dataGridView1.Columns[11].Visible = false;                        dataGridView1.Columns[12].Visible = false;                        dataGridView1.Columns[13].Visible = false;                        dataGridView1.Columns[14].Visible = false;                        dataGridView1.Columns[15].Visible = false;                        dataGridView1.Columns[16].Visible = false;                        dataGridView1.Columns[17].Visible = false;                        dataGridView1.Columns[18].Visible = false;                        dataGridView1.Columns[19].Visible = false;                        dataGridView1.Columns[20].Visible = false;                        dataGridView1.Columns[21].Visible = false;                        dataGridView1.Columns[22].Visible = false;                        dataGridView1.Columns[23].Visible = false;                        dataGridView1.Columns[24].Visible = false;                        dataGridView1.Columns[25].Visible = false;                        dataGridView1.Columns[26].Visible = false;                        dataGridView1.Columns[27].Visible = false;                        dataGridView1.Columns[28].Visible = false;                        dataGridView1.Columns[29].Visible = false;                        dataGridView1.Columns[30].Visible = false;                        dataGridView1.Columns[31].Visible = false;                    }


 

原创粉丝点击