gpt4 book ai didi

c# - 数据源不反射(reflect) DataGridView 中的排序

转载 作者:太空宇宙 更新时间:2023-11-03 17:25:04 26 4
gpt4 key购买 nike

我将 DataTable 绑定(bind)为 DataGridViewDataSource。我为所有 DataGridViewColumn 启用了 SortMode 属性为 Automatic。但是,当我在 DataGridView 上排序时,排序更改并未反射(reflect)在底层数据源(即数据表)中。
例如:

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;


现在,如果我要像下面那样获取选定的行,它将始终返回 DataTable 中索引为 0 的行即使在排序之后也就是 Alex, 27

DataRow newRow = table.NewRow();
newRow.ItemArray = table.Rows[dataGridView1.Rows.IndexOf(dataGridView1.SelectedRows[0])].ItemArray.Clone() as object[];

有人可以建议我应该如何处理这种情况吗?

最佳答案

首先是DataTable对象与 DataGridView 分离即使你将它绑定(bind)到 DataSource ,也就是说,如果您更改 DataGridView它不会影响你的 DataTable .在您的情况下,您希望在 DataGridView 中进行排序反射(reflect)在DataTable .因此,出于这个原因,每次 DataGridView 中的排序/排序发生变化时,您都需要捕获一个事件。 .因此,您需要在这方面捕获 ColumnHeaderMouseClick DataGridView 事件.

另一个重要的事情是,在实现对 DataTable 的同步排序时和 DataGridViewDefaultView Datable的方法|具有 Sort 的类属性(property)。所以,我们要做的是每次 DataGridView更改排序方式我们将对 DataTable 进行排序还有。

首先,我们需要使 DataTable 对象成为全局对象,以便我们以后可以在任何地方访问它。

DataTable table;

其次,我们需要为 ColumnHeaderMouseClick 初始化一个事件监听器。为了我们的实际目的,我们将其设置为 Form构造函数。

InitializeComponent();
dataGridView1.ColumnHeaderMouseClick += new DataGridViewCellMouseEventHandler(dataGridView1_ColumnHeaderMouseClick);

然后我们有这个空的鼠标事件处理程序:

 void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{

}

如果上述方法没有自动出来,只需复制并粘贴您的代码即可。

为了便于说明,我们将添加 DataTableForm 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;

最后我们将在 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.
}

您现在可以使用表对象并根据 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);
}

关于c# - 数据源不反射(reflect) DataGridView 中的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19681947/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com