我的Windows窗体应用程序中有一个DataGridView gridFilas
,其中有两列,第二列始终包含可以转换为整数的字符串。当我单击以对其进行排序时,它会按字符串进行排序,结果如下:
1, 11, 2, 22
但是我需要将其排序为整数,例如:
1, 2, 11, 22
我已经尝试了this question的所有答案,但是没有一个有效,但被接受的答案却没有用,因为this的事件没有因为{{3}而被触发}。
所以到目前为止,我一直在尝试添加SortCompare
并对其进行排序:
ColumnHeaderMouseClick
数据源是在创建(private void gridFilas_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
// this for loop has been added in a vain hope of converting all elements to integer to see if it works...
for (int i = 0; i < gridFilas.Rows.Count; i++)
{
string v = gridFilas.Rows[i].Cells[1].Value.ToString();
gridFilas.Rows[i].Cells[1].Value = Convert.ToInt32(v);
}
if (queuesSortedAscending)
{
gridFilas.Sort(gridFilas.Columns["Tamanho_Fila"], System.ComponentModel.ListSortDirection.Descending);
}
else
{
gridFilas.Sort(gridFilas.Columns["Tamanho_Fila"], System.ComponentModel.ListSortDirection.Ascending);
}
queuesSortedAscending = !queuesSortedAscending;
}
的构造函数)时设置的:
Form
每当我向数据源添加新行时,就确保将其解析为int:
dsComponentes = new DataSet();
// ... more code
gridFilas.DataSource = dsComponentes.Tables["Queue"];
我还尝试过预先更改列的数据类型:
DataRow qlinha = dsComponentes.Tables["Queue"].NewRow();
qlinha["Nome_Fila"] = process;
qlinha["Tamanho_Fila"] = Int32.Parse(status);
dsComponentes.Tables["Queue"].Rows.Add(qlinha);
所以,我不知道该怎么办,我只需要将其排序为整数而不是字符串即可。欢迎任何解决方案。
答案 0 :(得分:2)
您永远不会显示要绑定到DataTable
的{{1}}的创建位置,但是当您添加该列时,您应该能够指出它是{{1} }。
dsComponentes.Tables["Queue"]
这将导致绑定的int
将该列排序为整数。
如果您正在使用设计器来创建var dataTable = new DataTable();
dataTable.Columns.Add("ColumnName", typeof(int));
,那么在Columns Collection编辑器中似乎也有一个DataGridView
。您可以在该列上将类型设置为DataType
,它将按照您的期望进行排序。
DataSet
答案 1 :(得分:1)
最简单的方法是使用nuget包:Equin ApplicationFramework BindingListView
它与标准.net BindingList非常相似,不同之处在于它包含要排序的函数。
现在,您的类的所有公共属性将在DataGridView中显示为列。相应地编辑列:删除不需要的列。
在我的示例中,我将对“人物”序列进行排序:
class Person
{
public int Id {get; set;}
public string Name {get; set;}
public DateTime BirthDate {get; set;}
}
转到您的Form1类。我们将从nuget包中添加一个BindingListView作为成员。 在构造函数中,我们将其分配给分配给DataGridView的绑定源。
class Form
{
// the BindingListView from the nuget package:
private readonly BindingListView<Person> sortableBindingListView;
// constructor
public Form1()
{
InitializeComponent();
// make sure there is a Components Container, that will dispose
// the components upon disposal of the form
if (this.components == null)
{
this.components = new System.ComponentModel.Container();
}
// construct the sortable BindingListView for Persons:
this.sortableBindingListView = new BindingListView<Person>(this.components);
// create some Persons:
var persons = new Person[]
{
new Person{Id = 1, Name = "F", BirthDate = new DateTime(2000, 1, 1)},
new Person{Id = 2, Name = "A", BirthDate = new DateTime(1998, 4, 7)},
new Person{Id = 3, Name = "C", BirthDate = new DateTime(2011, 3, 8)},
new Person{Id = 4, Name = "Z", BirthDate = new DateTime(1997, 2, 3)},
new Person{Id = 5, Name = "K", BirthDate = new DateTime(2003, 9, 5)},
};
// Assign the DataSources:
this.sortableBindingListView.DataSource = persons;
this.dataGridView1.DataSource = this.sortableBindingListView;
}
}
这足以使您的排序工作正常进行。您不必添加任何其他内容。单击列后,该列将被过滤。
一些有趣的功能:
private Person SelectedPerson
{
get {return ((ObjectView<Person>)this.SortableBindingSource.Current)?.Object; }
}
private void DisplayPersons (IEnumerable<Person> personsToDisplay)
{
this.SortableBindingSource.DataSource = personsToDisplay.ToList();
this.SortableBindingSource.Refresh(); // this will update the DataGridView
}
private IEnumerable<Person> DisplayedPersons
{
get {return this.SortableBindingSource; }
// BindingListview<T> implements IEnumerable<T>
}
这就是全部。您无需创建特殊功能即可对鼠标单击进行排序。排序将自动进行,包括排序顺序并显示正确的排序标志符号。
如果要以编程方式进行排序:
// sort columnPropertyA in descending order:
this.SortableBindingSource.Sort(this.columnPropertyA.ListsortDirection.Descending);
关于BindingListView的优点之一是过滤选项:
// show only items where Name not null:
this.SortableBindingSource.ApplyFilter(person => person.Name != null);
// remove the filter:
this.SortableBindingSource.RemoveFilter();
我不确定在应用或删除过滤器后是否需要Refresh()。