none
我刚学C#,想实现一下ID自动补漏的功能,请高手给个实例,谢谢. RRS feed

  • 问题

  • 如图,

    1) 比如第一行的序号是1,第二行序号是2,第三行序号是3,我需要删除第二行,当我删除第二行之后,原先第三行的序号变成2.

    2) 同上,我需要删除第二行,删除后其它序号都不变,当我点击添加时,添加上去的序号自动变成2.

    本身我就是初学者,为了实现这两个功能,我想的头都大了,原理,概念都是越想越模糊.麻烦高手分别给个实例,谢谢!~~

    2012年4月21日 12:47

答案

  • 1)第一个问题,当删除某行之后你应该设法截取“RowDeleted”事件,改变其它所有的行的id,并且保存

    namespace CSharp
    {
        public partial class Form1 : Form
        {
            DataTable dt = new DataTable();
            DataGridView dv = new DataGridView();
    
            public Form1()
            {
                InitializeComponent();
               
                dv.Parent = this;
                dv.Dock = DockStyle.Top;
                dv.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                dv.AllowUserToDeleteRows = false;
                dv.AllowUserToAddRows = false;
                Button btn = new Button();
                btn.Text = "删除";
                btn.Parent = this;
                btn.Dock = DockStyle.Bottom;
                btn.Click += new EventHandler(btn_Click);
                dt.Columns.Add("序号", typeof(int));
                dt.Columns.Add("章节名称", typeof(string));
    
                for (int i = 1; i <6; i++)
                {
                    dt.Rows.Add(i, "章节" + i);
                }
                dv.DataSource = dt;
                //删除行之后发生
                dt.RowDeleted += new DataRowChangeEventHandler(dt_RowDeleted);
            }
    
            void dt_RowDeleted(object sender, DataRowChangeEventArgs e)
            {
                //重新编号
                int i=1;
    
                foreach (DataRow item in dt.Rows)
                {
                    item[0] = (i++);
                }
            }
    
            void btn_Click(object sender, EventArgs e)
            {
                if (dv.SelectedRows != null)
                {
                    //删除选中的行
                    dt.Rows[dv.SelectedRows[0].Index].Delete();
                }
            }
    
        }
    }

    2)使用Queue保存删除的序号,然后在添加按钮中恢复:

    namespace CSharp
    {
        public partial class Form1 : Form
        {
            DataTable dt = new DataTable();
            DataGridView dv = new DataGridView();
            Queue<int> deletednums = new Queue<int>();
            public Form1()
            {
                InitializeComponent();
               
                dv.Parent = this;
                dv.Dock = DockStyle.Top;
                dv.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                dv.AllowUserToDeleteRows = false;
                dv.AllowUserToAddRows = false;
    
                Button btn = new Button();
                btn.Text = "删除";
                btn.Parent = this;
                btn.Dock = DockStyle.Top;
    
                Button btn2 = new Button();
                btn2.Text="增加";
                btn2.Parent=this;
                btn2.Dock=DockStyle.Top;
    
                btn.Click += new EventHandler(btn_Click);
                dt.Columns.Add("序号", typeof(int));
                dt.Columns.Add("章节名称", typeof(string));
                btn2.Click+=new EventHandler(btn2_Click);
                for (int i = 1; i <6; i++)
                {
                    dt.Rows.Add(i, "章节" + i);
                }
                dt.AcceptChanges();
    
                dv.DataSource = dt;
                dt.RowDeleted += new DataRowChangeEventHandler(dt_RowDeleted);
            }
    
            void btn2_Click(object sender, EventArgs e)
            {
    
                //保存已删除的序号
                if (deletednums.Count == 0)
                {
                    MessageBox.Show("没有删除过行!");
                }
                else
                {
                    //弹出已经删除的行序号
                    int id = deletednums.Dequeue();
                    dt.Rows.Add(id, "章节" + id);
                }
            }
    
            void dt_RowDeleted(object sender, DataRowChangeEventArgs e)
            {
                deletednums.Enqueue(Convert.ToInt32(e.Row[0,DataRowVersion.Original]));
            }
    
           
    
            void btn_Click(object sender, EventArgs e)
            {
                if (dv.SelectedRows != null)
                {
                    dt.Rows[dv.SelectedRows[0].Index].Delete();
                }
            }
        }
    }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 呆oO 2012年4月22日 13:43
    2012年4月22日 2:01
    版主

全部回复

  • 1)第一个问题,当删除某行之后你应该设法截取“RowDeleted”事件,改变其它所有的行的id,并且保存

    namespace CSharp
    {
        public partial class Form1 : Form
        {
            DataTable dt = new DataTable();
            DataGridView dv = new DataGridView();
    
            public Form1()
            {
                InitializeComponent();
               
                dv.Parent = this;
                dv.Dock = DockStyle.Top;
                dv.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                dv.AllowUserToDeleteRows = false;
                dv.AllowUserToAddRows = false;
                Button btn = new Button();
                btn.Text = "删除";
                btn.Parent = this;
                btn.Dock = DockStyle.Bottom;
                btn.Click += new EventHandler(btn_Click);
                dt.Columns.Add("序号", typeof(int));
                dt.Columns.Add("章节名称", typeof(string));
    
                for (int i = 1; i <6; i++)
                {
                    dt.Rows.Add(i, "章节" + i);
                }
                dv.DataSource = dt;
                //删除行之后发生
                dt.RowDeleted += new DataRowChangeEventHandler(dt_RowDeleted);
            }
    
            void dt_RowDeleted(object sender, DataRowChangeEventArgs e)
            {
                //重新编号
                int i=1;
    
                foreach (DataRow item in dt.Rows)
                {
                    item[0] = (i++);
                }
            }
    
            void btn_Click(object sender, EventArgs e)
            {
                if (dv.SelectedRows != null)
                {
                    //删除选中的行
                    dt.Rows[dv.SelectedRows[0].Index].Delete();
                }
            }
    
        }
    }

    2)使用Queue保存删除的序号,然后在添加按钮中恢复:

    namespace CSharp
    {
        public partial class Form1 : Form
        {
            DataTable dt = new DataTable();
            DataGridView dv = new DataGridView();
            Queue<int> deletednums = new Queue<int>();
            public Form1()
            {
                InitializeComponent();
               
                dv.Parent = this;
                dv.Dock = DockStyle.Top;
                dv.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                dv.AllowUserToDeleteRows = false;
                dv.AllowUserToAddRows = false;
    
                Button btn = new Button();
                btn.Text = "删除";
                btn.Parent = this;
                btn.Dock = DockStyle.Top;
    
                Button btn2 = new Button();
                btn2.Text="增加";
                btn2.Parent=this;
                btn2.Dock=DockStyle.Top;
    
                btn.Click += new EventHandler(btn_Click);
                dt.Columns.Add("序号", typeof(int));
                dt.Columns.Add("章节名称", typeof(string));
                btn2.Click+=new EventHandler(btn2_Click);
                for (int i = 1; i <6; i++)
                {
                    dt.Rows.Add(i, "章节" + i);
                }
                dt.AcceptChanges();
    
                dv.DataSource = dt;
                dt.RowDeleted += new DataRowChangeEventHandler(dt_RowDeleted);
            }
    
            void btn2_Click(object sender, EventArgs e)
            {
    
                //保存已删除的序号
                if (deletednums.Count == 0)
                {
                    MessageBox.Show("没有删除过行!");
                }
                else
                {
                    //弹出已经删除的行序号
                    int id = deletednums.Dequeue();
                    dt.Rows.Add(id, "章节" + id);
                }
            }
    
            void dt_RowDeleted(object sender, DataRowChangeEventArgs e)
            {
                deletednums.Enqueue(Convert.ToInt32(e.Row[0,DataRowVersion.Original]));
            }
    
           
    
            void btn_Click(object sender, EventArgs e)
            {
                if (dv.SelectedRows != null)
                {
                    dt.Rows[dv.SelectedRows[0].Index].Delete();
                }
            }
        }
    }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 呆oO 2012年4月22日 13:43
    2012年4月22日 2:01
    版主
  • 太详细了,谢谢东哥!~~~


    C#初学者!~~~

    2012年4月22日 13:43
  • 太详细了,谢谢东哥!~~~


    C#初学者!~~~

    不用谢!希望常来MSDN共享技术以及交流问题……帮助别人……

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年4月23日 1:25
    版主
  • 我会努力向东哥学习,我会常来MSDN,今天才发现MSDN是个宝地呀。


    C#初学者!~~~

    2012年4月23日 14:16