Programování
Form datagrid
Data grid view slouší k zobrazení data třeba z nějaké kolekce. Vhodné je pro to používat list s názvem BindingList
Na tuhle otázku, není potřeba umět připojení k databazi, jedná se pouze o práci s datagridem.

Sám o sobě má metody na přidávání uživatelem a pod, doporučuju je vypnout (viz obrazek).
Přidání collums
Timto přidáme sloupec přes UI, převážně ta správná cesta, ovšem mužeme přidat atributy k vlastnostem třídy a automaticky se vytvoři
Přes AutoSizeCollumnMode = fill udělá hezčí zobrazení
Přídávání hodnot ručně
Nejlehčím způsobem, co jde tak je rows.add(), ale musime vedět, že v tomto případě přidáváme params objektu a jeden objekt je jedna buňka.
    
Random rnd = new Random();

this.dataGridView1.Rows.Add("Jakub", 50);
this.dataGridView1.Rows.Add(new string("Adam"), rnd.Next(5,50) );
this.dataGridView1.Rows.Add(Color.Black, Color.Black.A); // Object, takže jde vložit cokoliv
    
Přídávání hodnot přes datasource
Do datagridu mužeme přidávat data přes datasource, což je například List a nebo preferovaně BindingList. Všechno musí dědit z IListSource

List nebo binding list nám umožnuje vypisovat vlastnosti z objektu, avšak musíme všechno správně připravit přidáváním collums.
Pokud přidáme collum, je potřeba vlastnost collumu DataPropertyName na název vlastnosti, kterou chceme vypsat. Pokud tak neuděláme a liší se názvy stane to co na obrázku. Tuto hodnotu můžeme změnit v UI.
Zle
Dobře
List nebo BindingList
List se pouze seznam, který se neobnovuje automaticky. Pro automatickou obnovu je poteřeba odebrat datasource a zase přidat.
    
dataSource = null;
dataSource = NasList;
    
BindingList má event addingNew a ListChanged který mění hodntoy v datagridu.

IListSource je způsob jak udělat vlastní dataSource, nikoliv bindingList. Mužeme tam například i vložit array, ale musíme vracet, cokoliv co dědí z IList
    
public class PersonDataModel : IListSource
{
    private BindingList<Person> data = new BindingList<Person>();

    public bool ContainsListCollection => true;

    public IList GetList()
    {
        return this.data;
    }
}
    
Za předpokladu že AutoGenerateColumns = true (tyto hodnoty jsou ve tříde Person)
    
        [browsable(false)] public int Id {get;set;}  
        // zakazuje výpis 

        [DisplayName("Jméno")] public string Name {get;set;} 
        // ukaže v tabulce název "Jméno" namísto Name
    
Vybírání hodnot podle kliknutí
Přidáme event cellClick, která má sender a DataGridViewCellEventArgs

sender - jedná se o datagridview
DataGridViewCellEventArgs - jedná se hodnotu, která má dvě proměné RowIndex a ColumnIndex

Na získání hodnot jsou tyto věci.
    
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    var selectedItem = dataGridView1.SelectedCells[0].Value; 
    // Vybere přesně tu hodnotu, na kterou se kliklo

    var item = dataGridView1.Rows[e.RowIndex].DataBoundItem; 
    // Vybere celý ten item na který se kliklo
}
    
Pokud nebudeme mít dispozici DataGridViewCellEventArgs
    
private void button1_Click(object sender, EventArgs e)
{
    var selectedItem = dataGridView1.SelectedCells[0].Value;
    // Vybere přesně tu hodnotu, na kterou se kliklo    

    var selectedRowIndex = dataGridView1.SelectedCells[0].RowIndex;
    var item = dataGridView1.Rows[selectedRowIndex].DataBoundItem;
    // Vybere celý ten item na který se kliklo
}