无法将C#DataGridView列排序为整数

时间:2019-07-10 19:55:40

标签: c# windows-forms-designer

我的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);

所以,我不知道该怎么办,我只需要将其排序为整数而不是字符串即可。欢迎任何解决方案。

2 个答案:

答案 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非常相似,不同之处在于它包含要排序的函数。

  • 将BindingListView nuget导入您的项目
  • 使用Visual Studio设计器创建表单
  • 使用工具箱将BindingSource添加到您的表单中
  • 转到此BindingSource的属性,依次选择“数据源”,“添加项目数据源”,“对象”并添加要显示在DataGridView中的项目类别。
  • 现在使用工具箱添加您的DataGridView
  • 在DataGridView的属性中,选择BindingSource作为数据源。

现在,您的类的所有公共属性将在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()。