none
DataGridView sorting RRS feed

  • Domanda

  • Salve a tutti,

    dopo diverse ore di prove ancora non sono riuscitp a trovare un modo per ordinare un DataGridView, dovrei sia programmaticamente al caricamento dei dati che quando l'utente fa click sull'header della colonna.

    Ricevo i dati da un database SQL caricato su uno spazio FTP in un DataSet (connector.data).

    Ho provato anche con l'evento SortCompare che però non viene richiamato, ese provo a fare un Sort programmaticamente ricevo un'eccezione.

    DataView dv = connector.data.Tables[0].DefaultView;
                    dv.RowFilter = filter;
    
                    //table.AutoGenerateColumns = true;
                    table.DataSource = dv; // dataset
    
                    foreach (DataGridViewColumn column in table.Columns)
                    {
                        column.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                    }
    
                    List<Location> locations = connector.GetLocationsList();
                    Location location;
    
                    switch (tableName)
                    {
    
                        case "Case":
                            table.Columns[0].HeaderText = "Numero";
                            table.Columns[1].HeaderText = "Tipo";
                            table.Columns[2].HeaderText = "Container";
                            table.Columns[3].HeaderText = "Carico";
                            table.Columns[8].HeaderText = "Descrizione";
                            table.Columns[7].Visible = false;
                            table.Columns[9].Visible = false;
    
                            foreach (DataGridViewRow row in table.Rows)
                                row.Cells[3].Value = row.Cells[3].Value.ToString() == "short" ? "Punta" : "Pancia";
                            break;
    }

    venerdì 14 giugno 2019 16:58

Tutte le risposte

  • Puoi leggere questo articolo sulla DatagridView

    https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.datagridview.sort?view=netframework-4.8

    Oppure questo che spiega come sortare la Dataview sorgente

    https://docs.microsoft.com/it-it/dotnet/api/system.data.dataview.sort?view=netframework-4.8


    Sabrina C. - http://www.dotnetwork.it

    lunedì 17 giugno 2019 16:44
  • Avevo già visto la guida del primo link e infatti ricevo questa eccesione:

    System.InvalidOperationException: 'Un controllo DataGridView con associazione a dati non può utilizzare l'operatore di confronto per eseguire l'operazione di ordinamento.'

    Nel secondo link invece non spiega come poter ordinare una colonna dove sono contenuti dei numeri, il mio problema è che le colonne vengono definite in automatico tutte come stringhe perchè ricavate da un XML letto da FTP (

    DataView dv = connector.data.Tables[0].DefaultView;

    )

    e quindi quando clicco sull'header della colonna vengono ordinati in questo modo (alfabetico):

    1

    10

    11

    2

    20

    21

    ......

    mercoledì 19 giugno 2019 08:42
  • Un XML può essere mappato direttamente in una classe .net (che può essere creata con copia ed incolla in visual studio) e poi messa a punto da te, quindi i numeri possono essere numeri e le stringhe stringhe ecc.

    Ma visto che mi parli di un dataset xml potrebbe essere più complicato, hai un esempio del dataset con qualche decina di righe per capire come procedere?


    Sabrina C. - http://www.dotnetwork.it

    mercoledì 19 giugno 2019 19:54
  • Non c'è modo, più semplicemente, di intercettare il click sull'header della colonna ed inserirsi nel processo di ordinamento, customizzandolo?

    venerdì 21 giugno 2019 05:14
  • Ciao Simone,

    Ho fatto un test dopo quanto mi hai detto utilizzando windows forms e la Datagridview, ho semplicemente creato una datatable leggendo una tabella del database Northwind e ho messo tale tabella come datasource della Datagridview e cliccando sui titoli delle colonne, il sort viene fatto in automatico.

    A questo punto probabilmente non ho capito bene su che tecnologia stai lavorando,

    Windows Forms o WPF oppure altro ancora?

    Se mi dai un idea probabilmente posso fare una prova e vedere cosa accade.

    p.s.

    // Questo è il codice messo nella form
    		/// <summary>
    		/// Data Table clienti
    		/// </summary>
    		private DataTable mCustomers;
    
    		/// <summary>
    		/// Data Table clienti
    		/// </summary>
    		///<remarks>
    		///</remarks>
    		public DataTable Customers
    		{
    			get
    			{
    				return mCustomers;
    			}
    			set
    			{
    				mCustomers = value;
    			}
    		}
    
    
    
    
    		private void Form1_Load(object sender, EventArgs e)
    		{
    			DpNorthwind dp = new DpNorthwind();
    			Customers = dp.GetCustomers();
    			dataGridView1.DataSource = Customers;
    		}
    
    
    //Questo è il codice che produce la datatable
    
    		private const string CNSTRING = "integrated security=SSPI;data source=localhost;persist security info=True;initial catalog=northwind;";
    
    
    		private const string SQL_Select_Customers = @"
    			SELECT [CustomerID]
    				  ,[CompanyName]
    				  ,[ContactName]
    				  ,[ContactTitle]
    				  ,[Address]
    				  ,[City]
    				  ,[Region]
    				  ,[PostalCode]
    				  ,[Country]
    				  ,[Phone]
    				  ,[Fax]
    			  FROM [Customers]
    			";
    
    		public DataTable GetCustomers()
    		{
    			DataTable dt = new DataTable();
    			using (SqlConnection cn = new SqlConnection(CNSTRING))
    			{
    				cn.Open();
    				SqlCommand cmd = new SqlCommand();
    				cmd.Connection = cn;
    				cmd.CommandText = SQL_Select_Customers;
    
    				SqlDataReader reader = cmd.ExecuteReader();
    				
    				dt.Load(reader);
    
    				cn.Close();
    			}
    			return dt;
    		}

    datagridview1 l'ho appoggiata sulla form e automaticamente il click sul titolo della colonna fa il sort.

    attendo input.

    saluti


    Sabrina C. - http://www.dotnetwork.it

    venerdì 21 giugno 2019 09:47
  • P.s.

    ho fatto anche una versione WPF per capire se fosse quello il caso, ma anche in WPF, inserendo il controllo DataGrid sulla window e assegnandogli all'ItemsSource in questo caso non la DataTable ma la sua DefaultView, il click sul titolo della colonna provoca il sort automatico.

    // Questo è il codice sulla mainwindow di WPF
    
    	/// <summary>
    		/// Data table dei clienti
    		/// </summary>
    		private DataTable mCustomers;
    
    		/// <summary>
    		/// Data table dei clienti
    		/// </summary>
    		///<remarks>
    		///</remarks>
    		public DataTable Customers
    		{
    			get
    			{
    				return mCustomers;
    			}
    			set
    			{
    				mCustomers = value;
    			}
    		}
    
    
    
    
    		private void MainWindow_ContentRendered(object sender, EventArgs e)
    		{
    			DpNorthwind dp = new DpNorthwind();
    			Customers = dp.GetCustomers();
    			dgData.ItemsSource = Customers.DefaultView;
    		}
    
    //Il codice che legge la datatable è uguale a quello per windows forms

    <!--Questo è lo xaml della window -->
    
    
    <Window x:Class="DataGridViewSortWPF.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:DataGridViewSortWPF"
    		ContentRendered="MainWindow_ContentRendered"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Grid>
    		<DataGrid Name="dgData" />
    	</Grid>
    </Window>
    


    Sabrina C. - http://www.dotnetwork.it

    venerdì 21 giugno 2019 09:57
  • Questo è il codice PHP:

    switch($table)
        {
            case "Products":
                            echo "<Data>".
                            "<Codice>{$row['Code']}</Codice>".
                            "<Descrizione>{$row['Description']}</Descrizione>".
                            "<Foto>{$row['Photo']}</Foto>".
                            "<Peso>{$row['Weight']}</Peso>".
                            "<Prezzo>{$row['Price']}</Prezzo>".
                            "<Case>{$row['Case']}</Case>".
                            "<Prev_Location>{$row['Prev_Location']}</Prev_Location>".
                            "<Current_Location>{$row['Current_Location']}</Current_Location>".
                            "<Next_Location>{$row['Next_Location']}</Next_Location>".
                            "<GroupP>{$row['GroupP']}</GroupP>".
                            "<Tags>{$row['Tags']}</Tags>".
                            "<Note>{$row['Note']}</Note>".
                            "<Pieces>{$row['Pieces']}</Pieces>".
                            "</Data>";

    martedì 25 giugno 2019 21:19
  • Lavoro in windows form ma tutto viene considerato come strgina perchè faccio una chiamata PHP che mi restituisce un XML con i risultati della chiamata, quindi a quel punto "ho perso" il tipo di variabile per ogni colonna della tabella e vado a popolare il DataGridView con tutte colonne di stringhe e cliccando sull'header i numeri vengono ordinati in ordine alfabetico e non numerico.
    martedì 25 giugno 2019 21:23
  • Ciao,

    e se tu provassi a convertire tutti i numeri, in stringhe allineate a destra? A questo punto, l'ordinamento numerico (cliccando sull'header della colonna) funzionerebbe, anche se sono rappresentati come stringhe. Prova queste righe di codice:

    DataTable table = dv.Table;            
    foreach (DataRow riga in table.Rows)
    {
        foreach (DataColumn colonna in table.Columns)
        {
           if (Int32.TryParse(riga[colonna.ColumnName].ToString(), out int i))                    
              riga[colonna.ColumnName] = new string(' ', 10 - i.ToString().Length) + i.ToString();
        }
    }


    mercoledì 26 giugno 2019 14:56
  • Se PHP ti restituisce una struttura dati XML puoi creare una classe in C# e fare una readxml del file xml che ti genera variabili tipizzate che poi puoi inserire come datasource della tua Datagridview.

    Se mi fai un esempio del file XML che ricevi con 3 righe posso indicarti come procedere.

    saluti


    Sabrina C. - http://www.dotnetwork.it

    giovedì 27 giugno 2019 09:47