DataGridView 移动行

前言

该片文章介绍了操作DataGridView时,对它的行进行移动操作。例如:对某一行进行上移、下移等。该篇文章只是介绍了其中一种方法,如有更好方法还请补充。

内容

我们可以制作这样的一个简单的界面:

DataGridView显示数据,其他几个按钮执行相关的操作。我把这四个按钮的事件统一写成一个点击事件,在再这个事件中根据按钮的名称判断进行了什么操作。当然,首先,我们需要一些数据。这里定义了一个Person类,存放人的姓名和性别。

Person类
 1 class Person
2 {
3 /// <summary>
4 /// person构造函数
5 /// </summary>
6 /// <param name="name">姓名</param>
7 /// <param name="sex">性别</param>
8 public Person(string name,string sex)
9 {
10 this.name = name;
11 this.sex = sex;
12 }
13
14 /// <summary>
15 /// 姓名
16 /// </summary>
17 private string name;
18 /// <summary>
19 /// 姓名
20 /// </summary>
21 public string Name
22 {
23 get { return name;}
24 set { name = value; }
25 }
26
27 /// <summary>
28 /// 性别
29 /// </summary>
30 private string sex;
31 /// <summary>
32 /// 性别
33 /// </summary>
34 public string Sex
35 {
36 get { return sex;}
37 set { sex = value; }
38 }
39 }

其次是后台代码。定义了一个全局的List<Person>对象,btnChangePosition为四个按钮的点击事件,对于其中一种“置顶”操作进行了注释,其他操作也是这种套路,就不再一一注释。

后台代码
  1 public partial class Form1 : Form
2 {
3 List<Person> persons = new List<Person>();
4
5 public Form1()
6 {
7 InitializeComponent();
8 }
9
10 private void btnChangePosition_Click(object sender, EventArgs e)
11 {
12 if (persons.Count > 1)
13 {
14 Button button = (Button)sender;
15 Person perList;
16 int selectedIndex = dgv.CurrentRow.Index; //得到当前选择行的索引
17 if (button.Name.Equals("btnMoveFirst"))//置顶操作
18 {
19 if (selectedIndex > 0)
20 {
21 if (dgv.SelectedRows.Count == 1)//选中一行,选择多行则不进行操作
22 {
23
24 perList = persons[selectedIndex];//把当前行对象的值赋给临时变量
25 persons.RemoveAt(selectedIndex);//从集合中删除当前的对象
26 persons.Insert(0, perList);//把该对象插到第一个位置
27
28 dgv.DataSource = persons;//绑定对象
29 dgv.Refresh();
30
31 dgv.Rows[selectedIndex].Selected = false;//当前选中行为假,因为进行置顶操作,当前选中行已经变化
32 dgv.Rows[0].Selected = true; //选中首行
33 dgv.CurrentCell = dgv.Rows[0].Cells[dgv.CurrentCell.ColumnIndex];//这里还需确定当前激活行
34
35 }
36 else
37 {
38 MessageBox.Show("请选择一行");
39 }
40 }
41 }
42 else if (button.Name.Equals("btnMoveUp"))//上移
43 {
44
45 if (selectedIndex > 0)
46 {
47 if (dgv.SelectedRows.Count == 1)//选中一行
48 {
49 perList = persons[selectedIndex];
50 persons.RemoveAt(selectedIndex);
51 persons.Insert(selectedIndex - 1, perList);
52
53 dgv.DataSource = persons;
54 dgv.Refresh();
55
56 dgv.Rows[selectedIndex].Selected = false;
57 dgv.Rows[selectedIndex - 1].Selected = true;
58 dgv.CurrentCell = dgv.Rows[selectedIndex - 1].Cells[dgv.CurrentCell.ColumnIndex];
59 }
60 else
61 {
62 MessageBox.Show("请选择一行");
63 }
64
65 }
66 }
67 else if (button.Name.Equals("btnMoveDown"))//下移
68 {
69
70 if (selectedIndex < persons.Count - 1)
71 {
72 if (dgv.SelectedRows.Count == 1)//选中一行
73 {
74 perList = persons[selectedIndex];
75 persons.RemoveAt(selectedIndex);
76 persons.Insert(selectedIndex + 1, perList);
77
78 dgv.DataSource = persons;
79 dgv.Refresh();
80
81 dgv.Rows[selectedIndex].Selected = false;
82 dgv.Rows[selectedIndex + 1].Selected = true;
83 dgv.CurrentCell = dgv.Rows[selectedIndex + 1].Cells[dgv.CurrentCell.ColumnIndex];
84 }
85 else
86 {
87 MessageBox.Show("请选择一行");
88 }
89
90 }
91 }
92 else if (button.Name.Equals("btnMoveLast"))//置底
93 {
94
95 if (selectedIndex < persons.Count - 1)
96 {
97 if (dgv.SelectedRows.Count == 1)//选中一行
98 {
99 perList = persons[selectedIndex];
100 persons.RemoveAt(selectedIndex);
101 persons.Insert(persons.Count, perList);
102
103 dgv.DataSource = persons;
104 dgv.Refresh();
105
106 dgv.Rows[selectedIndex].Selected = false;
107 dgv.Rows[persons.Count - 1].Selected = true;
108 dgv.CurrentCell = dgv.Rows[persons.Count - 1].Cells[dgv.CurrentCell.ColumnIndex];
109 }
110 else
111 {
112 MessageBox.Show("请选择一行");
113 }
114
115 }
116 }
117 }
118 }
119
120 private void Form1_Load(object sender, EventArgs e)
121 {
122
123 persons.Add(new Person("小明",""));
124 persons.Add(new Person("小红", ""));
125 persons.Add(new Person("小蓝", ""));
126 persons.Add(new Person("小李", ""));
127
128
129 dgv.DataSource = persons;
130
131
132 }
133
134
135 }
原文地址:https://www.cnblogs.com/Johnny_Z/p/2147990.html