实现双击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;
            }