Formát DataGridView   zodpovězená otázka

VB.NET, WinForms

Sice jsem něco našel bohužel to nefunguje. Potřeboval bych zformátovat čísla v dataGridView na 2 desetinné místa. dataGridView ma datasource dataTable, kde jsou data typu double. Použil jsem příkazy uvedené níž, bohužel funguje jenom změna barvy ne formát. Třeba ještě něco nastavit?

     DataGridViewTab.Columns(0).DefaultCellStyle.Format = "dd.MM.yyyy  HH:mm"
        'Me.DataGridViewTab.Columns(0).DefaultCellStyle.Format = "dd,MM,yy  HH:mm"
        DataGridViewTab.Columns(1).DefaultCellStyle.Format = "C2"
        For col As Integer = 1 To DataGridViewTab.Columns.Count - 1
            DataGridViewTab.Columns(col).DefaultCellStyle.Format = "####,##"
            DataGridViewTab.Columns(1).DefaultCellStyle.Format = "C2"
            DataGridViewTab.Columns(col).DefaultCellStyle.ForeColor = Color.Red
        Next

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já jsem to řešil takto:

            foreach (DataGridViewColumn dc in this.Columns)
            {
                if(dc.ValueType == typeof(decimal))
                {
                    dc.DefaultCellStyle.Format = "N2";
                    dc.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
                    dc.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                } 
                if (dc.ValueType == typeof(int))
                {
                    dc.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
                    dc.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                }
}

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkusil jsem , ale výsledek je stejný, zarovnaní a změnu barvy udělá, ale formát čísla je stále na x des. míst, místo dvou.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To je zvláštní, mně to funguje korektně. Pokud zadám jako formát C2 mám měnu se 2 desetinnými místy. Pokud zadám C5 desetinných míst je 5.

Data které jsou načítány z databáze mám typu decimal(18,5)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Kde ten format nastavujete? Možná se to musí nastavit před připojením dat. Já to mám jako vlastní komponentu postavenou na DataGridView, která to má už přednastaveno a funguje mi to.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Formát nastavuju až po načtení dat (předtím by to ani nešlo protože mám jen prázdnou dataTable bez sloupců). Možná je pak potřeba zavolat refresh (nevím), ale zase je divné že jiné nastavení se tazateli zobrazí korektně.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Na formátování má vliv nastavení systému, konkrétně Místní a jazykové nastavení v Ovládacích panelech. Zkontrolujte tato nastavení.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ono je to asi jedno protože nefunguje žádné formátování, ani datum ani čísla. Když zadám parametr „N2“ tak by mněl zformátovat číslo na 2 des. místa bez ohledu na místní nastavení.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A odkud data načítáte (z jaké databáze)? A jaký mají datový typ v databázi?

Zkuste sem ještě hodit kód kterým data načítáte, třeba na něco příjdem.

A ještě mě napadlo zkusit zavolat refresh datagridViewu po tom, co změníte formát. Ale je to jen výkřik do tmy, mělo by to fungovat i bez něj.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Data načítám z SQL do dataTable a jsou typu double. Potom je ještě zkopíruji z jedné tabulky do druhé.

   Sub ReadDataFromSQL(ByVal strCommand As String)
        Dim OledbConnection As New OleDbConnection(CON_STRING)
        Try
            Dim dataAdapter As New OleDbDataAdapter(strCommand, OledbConnection)
            dataAdapter.Fill(frmMain.dtDataMain)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        OledbConnection.Close()
    End Sub

Ten refresh nepomohl jenom zarovnaní a změna barev proběhne vpořádku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nemůže být problém v onom kopírování? Co se stane když změníte formát v první table?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Máte pravdu, pro první tabulku jsem přidal DataGridView a tam formát funguje. Teď mám ale otázku co je špatně když kopíruji data z tabulky následovně.

    dtDataTab.Columns.Add(strName)
            For row = 0 To dtPom.Rows.Count - 1
                dtDataTab.Rows(row).Item(intColumnCount) = dtPom.Rows(row).Item(col)
            Next
            intColumnCount = intColumnCount + 1

Dělám to tak protože první tabulka slouží pro načítaní dat jak jsem uvedl výše a druhá slouží k sumarizaci načteních dat (obě tabulky mají stejný počet řádků v té druhé však postupně přibývají sloupce)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zřejmě bude potřeba nastavit datové typy sloupců v nové table. Předpokládám že pokud striktně nenastavíte datový typ, sloupec je pak brán jako string. A tam Vám samozřejmě nebude fungovat formátování čísel.

Vytvoření sloupce v dataTable s určením datového typu můžé vypadat třeba takto:

Dim sloupec As DataColumn=New DataColumn

sloupec.ColumnName = "jméno sloupce"
sloupec.DataType = Type.GetType("System.Int32") 'datový typ sloupce, v tomto případě integer
mojeDataTable.Columns.Add(sloupec) 'přidání sloupce do dataTable

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dekuji moc, Opět jste mněli pravdu. Nový Sloupec je nastaven jako string.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ješté mám jeden dotaz. Jde vložit (zkopírovat) celý stloupec z jedné tabulky do druhé za předpokladu, že mají rovnaký počet řádků?

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback