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