最近闲来无事,就做了个自定义显示隐藏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; }