2

DataTablea のとしてDataSourceaをバインドしていDataGridViewます。すべてのSortModeプロパティを有効にしました。しかし、DataGridView で並べ替えを行っている場合、並べ替えの変更は、DataTable である基になる DataSource に反映されていません。 例えば: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;


以下のように選択した行を取得すると、並べ替え後でもDataTable の 0 インデックスの行が常に返されますAlex, 27

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

誰かがこの状況にどう対処すべきか提案してもらえますか?

4

5 に答える 5

7

まず、オブジェクトを にバインドしたとしても、DataTableオブジェクトは から切り離されます。つまり、変更しても には影響しません。そしてあなたの場合、ソートをに反映させたいと思っています。そのため、 での順序付け/並べ替えに変更があるたびに、イベントをキャッチする必要があります。したがって、そのためには、のイベントをキャッチする必要があります。DataGridViewDataSourceDataGridViewDataTableDataGridViewDataTableDataGridViewColumnHeaderMouseClickDataGridView

もうひとつ重要なことは、両方の同期ソートを実現する上でDataTable、プロパティを持つクラスDataGridViewDefaultViewメソッドです。そのため、ソートに関して が変更されるたびに、 もソートします。DatableSortDataGridViewDataTable

最初に、後でどこからでもアクセスできるように、DataTable オブジェクトをグローバルにする必要があります。

DataTable table;

次に、イベントリスナーを初期化する必要がありColumnHeaderMouseClick、実用的な目的のためにFormコンストラクターで設定します。

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

次に、この空の Mouse イベント ハンドラーを作成します。

 void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
 {            

 }

上記の方法が自動的に出てこない場合は、コードをコピーして貼り付けてください。

DataTable説明のために、 duringを追加し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;

最後に、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);
  }
于 2013-10-31T06:18:07.883 に答える
3

DataTableをコンテナに入れて、BindingSourceこのクラスを のデータ ソースに設定できますDataGridView

BindingSource bindingSource1 = new BindingSource();
bindingSource1.DataSource = dataTable;
dataGridView1.DataSource = bindingSource1;
// another grid view options...

についてBindingSortは、このリンクを参照してください。

于 2013-10-30T12:52:10.453 に答える