顯示、隱藏DataGridView的列

最近閒來無事,就做了個自定義顯示隱藏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;
                    }



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章