lbr*_*him 1 c# sorting datatable datagridview winforms
我绑定一个DataTable作为DataSource的DataGridView。我为所有人启用了该SortMode属性。但是,当我在DataGridView上进行排序时,排序更改未反映在基础数据源(即DataTable)中。
例如:AutomaticDataGridViewColumn
DataTable table = new DataTable();
table.Columns.Add("Name");
table.Columns.Add("Age", typeof(int));
table.Rows.Add("Alex", 27);
table.Rows.Add("Jack", 65);
table.Rows.Add("Bill", 22);
dataGridView1.DataSource = table;
Run Code Online (Sandbox Code Playgroud)
现在,如果我要像下面那样获得选定的行,即使对 is 进行排序后,它也总是返回DataTable中0 Index处的行Alex, 27。
DataRow newRow = table.NewRow();
newRow.ItemArray = table.Rows[dataGridView1.Rows.IndexOf(dataGridView1.SelectedRows[0])].ItemArray.Clone() as object[];
Run Code Online (Sandbox Code Playgroud)
有人可以建议我应该如何处理这种情况吗?
首先,即使将DataTable对象DataGridView绑定到该对象,也将其与对象分离DataSource,也就是说,如果更改了对象DataGridView,则不会影响DataTable。而且,您希望排序DataGridView反映在中DataTable。因此,由于这个原因,您每次在中的排序/排序发生变化时都需要赶上一个事件DataGridView。你需要因此搭上了这方面ColumnHeaderMouseClick的情况DataGridView。
另一个重要的事情是,实现两者的同步排序,DataTable并且DataGridView是具有该属性DefaultView的Datable类的方法Sort。因此,我们要做的是每次DataGridView更改排序方式时-我们也将对它们进行排序DataTable。
首先,我们需要使DataTable对象成为全局对象,以便以后可以在任何地方访问它。
DataTable table;
Run Code Online (Sandbox Code Playgroud)
其次,我们需要初始化一个事件侦听器ColumnHeaderMouseClick,出于实际目的,我们将其设置在Form构造函数上。
InitializeComponent();
dataGridView1.ColumnHeaderMouseClick += new DataGridViewCellMouseEventHandler(dataGridView1_ColumnHeaderMouseClick);
Run Code Online (Sandbox Code Playgroud)
然后,我们有了这个空的Mouse事件处理程序:
void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
}
Run Code Online (Sandbox Code Playgroud)
如果上述方法没有自动出现,只需复制并粘贴代码即可。
而对于说明起见,我们将添加DataTable过程中Form Load,在这种情况下,我将使用自己的代码:
table = new DataTable();
table.Columns.Add("Name");
table.Columns.Add("Age", typeof(int));
table.Rows.Add("Alex", 27);
table.Rows.Add("Jack", 65);
table.Rows.Add("Bill", 22);
dataGridView1.DataSource = table;
Run Code Online (Sandbox Code Playgroud)
最后,我们将在ColumnHeaderMouseClick事件中添加一些代码:
void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if (dataGridView1.SortOrder.ToString() == "Descending") // Check if sorting is Descending
{
table.DefaultView.Sort = dataGridView1.SortedColumn.Name + " DESC"; // Get Sorted Column name and sort it in Descending order
}
else
{
table.DefaultView.Sort = dataGridView1.SortedColumn.Name + " ASC"; // Otherwise sort it in Ascending order
}
table = table.DefaultView.ToTable(); // The Sorted View converted to DataTable and then assigned to table object.
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用表格对象并根据的排序顺序对其进行排序DataGridView。
为了确认我的主张,我们将在您的表单中创建一个名为的按钮,button1单击该按钮将显示第一行和已排序的列值,例如:
private void button1_Click(object sender, EventArgs e)
{
String sortedValue = dataGridView1.SortedColumn.Name == "Name" : table.Rows[0][0].ToString() ? table.Rows[0][1].ToString();
MessageBox.Show(sortedValue);
}
Run Code Online (Sandbox Code Playgroud)