0

I have a datagridview with values that I add manualy with a datasource, however I want to add a button where the user can shuffle the order of where the values are located in the datagridview. Does anyone have an idead on how to apply this?

2 Answers2

0

if it comes from sql statement with

SELECT * FROM table
ORDER BY NEWID()

but if it is a different form of datasource

var data = //un randomed data
var randomData = data.OrderBy(x => Guid.NewGuid()).ToList();
//then bind randomData to your datasource

so on button click, update it by

getData(){
   //use either sql statement or OrderBy() then bind
}
Rand Random
  • 7,300
  • 10
  • 40
  • 88
Gabriel Llorico
  • 1,783
  • 1
  • 13
  • 23
0

Add a hidden column that contains a random number and sort the rows using that.

If you set AutoGenerateColumns to false you can specify the order of the columns.

void ShuffleDataGridView(DataGridView dataGridView, DataTable dataTable)
{
    // add or update random sort order column
    const string randomSortConst = "RandomSort";
    if (!dataTable.Columns.Contains(randomSortConst))
    {
        dataTable.Columns.Add(randomSortConst, typeof(int));
    }
    var rand = new Random();
    foreach (DataRow drw in dataTable.Rows)
    {
        drw[randomSortConst] = rand.Next();
    }
    // randomize column display
    dataGridView.AutoGenerateColumns = false;
    dataGridView.AllowUserToOrderColumns = false;
    dataGridView.Columns.Clear();
    var columnsToAdd = new List<DataColumn>();
    foreach (DataColumn dcl in dataTable.Columns)
    {
        if (!(dcl.ColumnName == randomSortConst))
        {
            columnsToAdd.Add(dcl);
        }
    }
    while (columnsToAdd.Count > 0)
    {
        var j = rand.Next(0, columnsToAdd.Count - 1);
        var dgvtbc = new DataGridViewTextBoxColumn
        {
            DataPropertyName = columnsToAdd[j].ColumnName,
            HeaderText = columnsToAdd[j].ColumnName // remove this line to hide column headings
        };
        dataGridView.Columns.Add(dgvtbc);
        columnsToAdd.RemoveAt(j);
    }
    // sort the rows using the hidden random column
    dataGridView.DataSource = new DataView(dataTable, string.Empty, randomSortConst, DataViewRowState.CurrentRows);
}
SSS
  • 4,807
  • 1
  • 23
  • 44