关于WInform中listbox鼠标拖动上下排序item的问题解决

来源:互联网 发布:java进程占用cpu高 编辑:程序博客网 时间:2024/05/21 00:19

最近鼓弄这个地方好长时间 在网上搜罗 这块儿的东东好少哟

不过有代码的 我调试了 总没反应

后来终于解决 原因是我的listbox的datasource是绑定一个datatable的

so  ...  从dt下手 代码如下

1、没datasource绑定的

 private void lsb_Para_DragDrop(object sender, DragEventArgs e)
        {
            ListBox listbox = (ListBox)sender;
            indexoftarget = listbox.IndexFromPoint(listbox.PointToClient(new Point(e.X, e.Y)));
            if (indexoftarget != ListBox.NoMatches)
            {

               listbox.Items.RemoveAt(indexofsource);
                listbox.Items.Insert(indexoftarget, obj);
                listbox.SelectedIndex = indexoftarget;
 

            }
        }

        private void lsb_Para_DragOver(object sender, DragEventArgs e)
        {

            //拖动源和放置的目的地一定是一个ListBox
            if (e.Data.GetDataPresent(typeof(System.String)) && ((ListBox)sender).Equals(lsb_Para))
            {
                e.Effect = DragDropEffects.Move;
            }
            else
                e.Effect = DragDropEffects.None;
        }

        private void lsb_Para_MouseDown(object sender, MouseEventArgs e)
        {
            indexofsource = ((ListBox)sender).IndexFromPoint(e.X, e.Y);

            if (indexofsource != ListBox.NoMatches)
            {
                ((ListBox)sender).DoDragDrop(((ListBox)sender).Items[indexofsource].ToString(), DragDropEffects.Move);
            }
        }
2、有绑定的


        private void lsb_Visible_DragDrop(object sender, DragEventArgs e)
        {
            ListBox listbox = (ListBox)sender;
            indexoftarget = listbox.IndexFromPoint(listbox.PointToClient(new Point(e.X, e.Y)));
            if (indexoftarget != ListBox.NoMatches)
            {
                object obj = listbox.Items[indexofsource];
                DataTable dt = (DataTable)listbox.DataSource;
                DataRow dr = dt.NewRow();
                dr["id"] = dt.Rows[indexofsource][0].ToString();
                dr["hang_name"] = dt.Rows[indexofsource][1].ToString();

                dt.Rows.RemoveAt(indexofsource);
                dt.Rows.InsertAt(dr, indexoftarget);
                listbox.SelectedIndex = indexoftarget;
                for (int i = 0; i < dt.Rows.Count; i++)
                {

                    string sql_updte = "update t_opr_hang set hang_paixu=" + (i + 1) + "where id=" + dt.Rows[i][0];
                    try
                    {
                        dbc.ExecuteSql(sql_updte);
                        Bind_Lsb_Para();
                    }
                    catch { }
                }

            }
        }

        private void lsb_Visible_DragOver(object sender, DragEventArgs e)
        {
            //拖动源和放置的目的地一定是一个ListBox
            if (e.Data.GetDataPresent(typeof(System.String)) && ((ListBox)sender).Equals(lsb_Visible))
            {
                e.Effect = DragDropEffects.Move;
            }
            else
                e.Effect = DragDropEffects.None;
        }

        private void lsb_Visible_MouseDown(object sender, MouseEventArgs e)
        {
            indexofsource = ((ListBox)sender).IndexFromPoint(e.X, e.Y);

            if (indexofsource != ListBox.NoMatches)
            {
                ((ListBox)sender).DoDragDrop(((ListBox)sender).Items[indexofsource].ToString(), DragDropEffects.Move);
            }
        }

 

 

区别在于从dt操作还是直接remove和insert

 

大家加油