实现双击listview单元格复制到剪切板,弹窗三秒后关闭
#region 双击listview单元格复制事件
this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.listView1_MouseDoubleClick);
#endregion
private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
{
//listView1.Items[1].Selected = true;
ListView listview = (ListView)sender;
ListViewItem lstrow = listview.GetItemAt(e.X, e.Y);
System.Windows.Forms.ListViewItem.ListViewSubItem lstcol = lstrow.GetSubItemAt(e.X, e.Y);
//int col = lstrow.SubItems.IndexOf(lstcol);//获取列号
//int length = listView1.SelectedItems.Count;//获取选中的行号
string strText = lstcol.Text;
//复制文本并在三秒后关闭
Clipboard.SetText(strText);
StartKiller();
MessageBox.Show("'" + strText + "'" + "已复制到剪贴板!", "提示", MessageBoxButtons.OK);
}
private void StartKiller()
{
Timer timer = new Timer();
timer.Interval = 3000; //3秒启动
timer.Tick += new EventHandler(Timer_Tick);
timer.Start();
}
private void Timer_Tick(object sender, EventArgs e)
{
KillMessageBox();
//停止Timer
((Timer)sender).Stop();
}
[System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]
private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int PostMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
public const int WM_CLOSE = 0x10;
private void KillMessageBox()
{
//按照MessageBox的标题,找到MessageBox的窗口
IntPtr ptr = FindWindow(null, "提示");
if (ptr != IntPtr.Zero)
{
//找到则关闭MessageBox窗口
PostMessage(ptr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
}
}
/*
private void listView_MouseDoubleClick(object sender, MouseEventArgs e)
{
ListView listview = (ListView)sender;
ListViewItem lstrow = listview.GetItemAt(e.X, e.Y);
System.Windows.Forms.ListViewItem.ListViewSubItem lstcol = lstrow.GetSubItemAt(e.X, e.Y);
string strText = lstcol.Text;
try
{
Clipboard.SetDataObject(strText);
notifyIcon1.Visible = true;
string info = string.Format("内容【{0}】已经复制到剪贴板", strText);
notifyIcon1.ShowBalloonTip(1500, "提示", info, ToolTipIcon.Info);
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}*/
ListView属性
lv.View = View.Details;//必须加 lv.GridLines = true;//显示网格线 lv.FullRowSelect = true;//单击可以选中一行 lv.MultiSelect = false;//不可以选中多行 lv.HoverSelection = true;//是否指针停留可以自动选中 lv.Items.Clear();//项清空 lv.Columns.Clear();//列名称清空
datatable转换为listview
static public void dataTableToListview(ListView lv, DataTable dt)
{
if (dt != null)
{
lv.View = View.Details;//必须加
lv.GridLines = true;//显示网格线
lv.FullRowSelect = true;//单击可以选中一行
lv.MultiSelect = false;//不可以选中多行
//lv.HoverSelection = true;//是否指针停留可以自动选中
lv.Items.Clear();
lv.Columns.Clear();
for (int i = 0; i < dt.Columns.Count; i++)
{
lv.Columns.Add(dt.Columns[i].Caption.ToString());
}
foreach (DataRow dr in dt.Rows)
{
ListViewItem lvi = new ListViewItem();
lvi.SubItems[0].Text = dr[0].ToString();
for (int i = 1; i < dt.Columns.Count; i++)
{
lvi.SubItems.Add(dr[i].ToString());
}
lv.Items.Add(lvi);
}
lv.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
}
}
listview转换为datatable
static public void listViewToDataTable(ListView lv, DataTable dt)
{
int i, j;
DataRow dr;
dt.Clear();
dt.Columns.Clear();
//生成DataTable列头
for (i = 0; i < lv.Columns.Count; i++)
{
dt.Columns.Add(lv.Columns[i].Text.Trim(), typeof(String));
}
//每行内容
for (i = 0; i < lv.Items.Count; i++)
{
dr = dt.NewRow();
for (j = 0; j < lv.Columns.Count; j++)
{
dr[j] = lv.Items[i].SubItems[j].Text.Trim();
}
dt.Rows.Add(dr);
}
}
listview复制选中行内容到另一个listview
if (listView1.SelectedItems.Count>0)
{
int count = listView1.SelectedItems.Count;
ListViewItem[] item2 = new ListViewItem[count];
for (int i = 0; i < count; i++)
{
item2[i] = (ListViewItem) listView1.SelectedItems[i].Clone();
}
listView2.Items.AddRange(item2);
}
listview清空
listView1.Items.Clear();
listview双击单元格编辑并更新listview
//以下代码实现双击listview单元格编辑内容
#region
private TextBox txtInput;
private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
{
try
{
if (this.txtInput != null)
{
//先释放文本框
this.txtInput.Dispose();
}
ListView listview = (ListView)sender;
ListViewItem lstrow = listview.GetItemAt(e.X, e.Y);
System.Windows.Forms.ListViewItem.ListViewSubItem lstcol = lstrow.GetSubItemAt(e.X, e.Y);
int col = lstrow.SubItems.IndexOf(lstcol);//获取列号
int length = listView1.SelectedItems.Count;//获取选中的行号
//string strText = lstcol.Text;
this.txtInput = new TextBox();
//找到文本框
Rectangle rect = lstrow.GetBounds(ItemBoundsPortion.Entire);
int StartX = rect.Left; //获取listview的X坐标
//int ColumnIndex = 0; //文本框的索引
//得到滑块的位置
//int pos = GetScrollPos(this.listView2.Handle.ToInt32(), 0);
//获取文本框的X坐标
for (int i = 0; i < col; i++)
{
StartX += listView1.Columns[i].Width;
}
//foreach (ColumnHeader Column in listView2.Columns)
//{
// if (e.X + pos >= StartX + Column.Width)
// {
// StartX += Column.Width;
// //ColumnIndex += 1;
// }
//}
//locate the txtinput and hide it. txtInput为TextBox
this.txtInput.Parent = this.listView1;
//begin edit
if (lstrow != null)
{
rect.X = StartX;
rect.Width = this.listView1.Columns[col].Width; //得到长度和ListView的列的长度相同
this.txtInput.Bounds = rect;
this.txtInput.Multiline = true;
//显示文本框
this.txtInput.Text = lstcol.Text;
this.txtInput.Tag = lstrow.SubItems[col];//只是传递这个索引的作用
this.txtInput.KeyPress += new KeyPressEventHandler(txtInput_KeyPress);
this.txtInput.Focus();
}
}
catch
{ }
}
//回车保存内容
private void txtInput_KeyPress(object sender, KeyPressEventArgs e)
{
try
{
if ((int)e.KeyChar == 13)
{
if (this.txtInput != null)
{
ListViewItem.ListViewSubItem lvst = (ListViewItem.ListViewSubItem)this.txtInput.Tag;
lvst.Text = this.txtInput.Text;
this.txtInput.Dispose();
//更新两者数据库
ListViewFill.listViewToDataTable(listView1, dt);
ListViewFill.listViewToDataTable(listView2, dt1);
}
}
}
catch
{ }
}
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
if (this.txtInput != null)
{
if (this.txtInput.Text.Length > 0)
{
ListViewItem.ListViewSubItem lvst = (ListViewItem.ListViewSubItem)this.txtInput.Tag;
lvst.Text = this.txtInput.Text;
//更新数据库dt
ListViewFill.listViewToDataTable(listView1, dt);
}
this.txtInput.Dispose();
}
}
catch
{ }
}
private void listView1_MouseClick(object sender, MouseEventArgs e)
{
//按鼠标左键
if (e.Button == MouseButtons.Left)
{
if (this.txtInput != null)
{
//先释放文本框
this.txtInput.Dispose();
}
}
}
#endregion
以上代码更改过,详见—原文,没有用到原文中所说的API进度条
listview添加右键菜单
1、插入控件 contextMenuStrip
2、在listview1的属性ContextMenuStrip中设置为刚插入的控件名称
3、写listview1事件 MouseClick
private void listView1_MouseClick(object sender, MouseEventArgs e)
{
//按鼠标右键
if (e.Button == MouseButtons.Right)
{
if (this.listView1.SelectedItems.Count > 0)
{
this.contextMenuStrip1.Show(this, e.Location);
}
else
{
this.contextMenuStrip1.Hide();
}
}
}
4、再增加contextMenuStrip的属性集合,编写单击contextMenuStrip控件的集合项事件。
- 使两个listview的列宽相等
for (int i = 0; i < listView2.Columns.Count; i++)
{
listView1.Columns[i].Width = listView2.Columns[i].Width;
}