Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Martin Svoboda:9.1.2016 14:36

Čaute potrebujem poradiť,
potrebujem urobiť porovnanie hodnôt z databázy a farebne odlíšiť riadky, ale zatiaľ mi to nefunguje .. tu je môj zatiaľ nefunkčný kód:

string a1 = "Obyčajná správa";
string a2 = "Stredne dôležitá";
string a3 = "Veľmi dôležitá";

v stĺpci priorita sú len tieto 3 reťazce.

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {

            using (MySqlConnection cnn = new MySqlConnection("Server=&&&;Database=OitDB;Uid=martin;Pwd=;"))
            {
                MySqlDataAdapter da = new MySqlDataAdapter("SELECT priorita FROM nrp", cnn);
                DataSet ds = new DataSet();
                da.Fill(ds, "nrp");

                List<string> LISTpriorita = new List<string>();
                foreach (DataRow row in ds.Tables["nrp"].Rows)
                {

                    LISTpriorita.Add(row["priorita"].ToString());
                    string s = LISTpriorita[0];
                    if (s == a1)
                    {
                        DataGridViewRow row1 = dataGridView1.Rows[e.RowIndex];
                        row1.DefaultCellStyle.BackColor = Color.White;
                        row1.DefaultCellStyle.ForeColor = Color.Black;
                    }
                    else if (s == a2)
                    {
                        DataGridViewRow row2 = dataGridView1.Rows[e.RowIndex];
                        row2.DefaultCellStyle.BackColor = Color.White;
                        row2.DefaultCellStyle.ForeColor = Color.Blue;
                    }
                    else if (s == a3)
                    {
                        DataGridViewRow row3 = dataGridView1.Rows[e.RowIndex];
                        row3.DefaultCellStyle.BackColor = Color.White;
                        row3.DefaultCellStyle.ForeColor = Color.Red;
                    }
                }
            }
            dataGridView1.ColumnHeadersVisible = false;
            dataGridView1.EnableHeadersVisualStyles = false;
        }
Editováno 9.1.2016 14:39
 
Odpovědět
9.1.2016 14:36
Avatar
Odpovídá na Martin Svoboda
Michal Štěpánek:9.1.2016 23:10

Nejsem si úplně jistý, ale podle mě hodnota

string s = LISTpriorita[0];

bude vždycky "a1" ne?

Nahoru Odpovědět
9.1.2016 23:10
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Martin Svoboda
Michal Štěpánek:9.1.2016 23:15

Podle toho tvého kódu mi přijde, že vždycky při projití řádku DGV přidáš do listu hodnotu té "priority", ale pak se v tom listu odkazuješ stále na první index. Nemělo by tam místo té nuly být číslo řádku DGV nebo číslo řádku - 1?

Nahoru Odpovědět
9.1.2016 23:15
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Martin Svoboda:10.1.2016 9:10

No tiež som už nad tým premýšľal, ale nie som si istý ako to korektne urobiť. Nad MySql chcem nasadiť trigger aby mi zobrazovalo stále posledných 50 riadkov. Možno niečo také?

for(int i = 0; i < 49; i++)
string s = LISTpriorita[i];

alebo si spočítam riadky v DGV a hodím to do cyklu

  int pocetDGV = dataGridView1.Rows.Count;
for(int i = 0; i < pocetDGV; i++)
string s = LISTpriorita[i];
Editováno 10.1.2016 9:13
 
Nahoru Odpovědět
10.1.2016 9:10
Avatar
Martin Svoboda:10.1.2016 9:22

No tak som to skúsil, ale nefunguje mi to hlási mi chybu v

string s = LISTpriorita[i];

takže asi robím zle zápis ... privítam každú radu :)

 
Nahoru Odpovědět
10.1.2016 9:22
Avatar
Odpovídá na Martin Svoboda
Michal Štěpánek:10.1.2016 11:22

a takhle?

string s = LISTpriorita[i].ToString();

Zkus si vypsat, co vlastně v tom listu máš. Pokud je to jen na výběr té "priority", myslím, že by bylo jednodušší ten list vynechat úplně a rovnou se odkazovat na hodnotu toho sloupce "priorita v DGV...

Nahoru Odpovědět
10.1.2016 11:22
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Martin Svoboda:10.1.2016 15:01

no ja v DGV stĺpec priorita nemám, je len v MySql ... skúšal som to aj bez listu ale tiež mi to nefungovalo, ale možno som to robil zle ... ako sa viem porovnávať všetky riadky medzi DGV a MySql bez listu?

 
Nahoru Odpovědět
10.1.2016 15:01
Avatar
jt.e
Člen
Avatar
Odpovídá na Martin Svoboda
jt.e:10.1.2016 15:36

string s = LISTpriorita[i];

podle mě může nefungovat pouze z jednoho důvodu, že index i překročí rozsah LISTpriorita

 
Nahoru Odpovědět
10.1.2016 15:36
Avatar
Odpovídá na jt.e
Martin Svoboda:10.1.2016 15:41

prekročiť rozsah určite nemôže, pretože keď použijem tento zápis

int pocetDGV = dataGridView1.Rows.Count;
for(int i = 0; i < pocetDGV; i++)
string s = LISTpriorita[i];

tak početDGV je taký istý ako počet v MySql a LISTpriorita si ukladá celý počet riadokov z MySql, takže počty sedia určite.

 
Nahoru Odpovědět
10.1.2016 15:41
Avatar
jt.e
Člen
Avatar
Odpovídá na Martin Svoboda
jt.e:10.1.2016 15:51

Ukaž prosím ještě tu část s naplněním těch sloupců, včetně opravy. Jsem sice začátečník (k MySQl jsem se ještě nedostal), ale nějak v uvedeném kódu nechápu smysl toho Listu LISTpriorita.

protože tady nevidím jeho plnění:
int pocetDGV = dataGridView1­.Rows.Count;
for(int i = 0; i < pocetDGV; i++)
string s = LISTpriorita[i];

podle mě, pokud hodnota, kterou hodíš do listu bude null, tak průser..

Editováno 10.1.2016 15:52
 
Nahoru Odpovědět
10.1.2016 15:51
Avatar
Martin Svoboda:10.1.2016 16:02

aha tak to ma nenapadlo ... určite tam mám zopár riadkov ktoré budú null. Zajtra idem robiť nový server tak to vyskúšam na čisto .. dám vedieť či to funguje

Ešte otázka ako by sa to dalo urobiť bez použitia LISTu??

 
Nahoru Odpovědět
10.1.2016 16:02
Avatar
Odpovídá na Martin Svoboda
Michal Štěpánek:10.1.2016 16:18

Co vlastně se ti zobrazuje v tom DGV?

Editováno 10.1.2016 16:18
Nahoru Odpovědět
10.1.2016 16:18
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
jt.e
Člen
Avatar
Odpovídá na Martin Svoboda
jt.e:10.1.2016 16:26

Jak jsem psal, moc nevím co ten kód dělá, ale protože jsi ten list, kromě přidání položek nepoužil, čekal bych něco takového:

    const string a1 = "Obyčajná správa";
    const string a2 = "Stredne dôležitá";
    const string a3 = "Veľmi dôležitá";

    private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        using (MySqlConnection cnn = new MySqlConnection("Server=&&&;Database=OitDB;Uid=martin;Pwd=;"))
        {
            MySqlDataAdapter da = new MySqlDataAdapter("SELECT priorita FROM nrp", cnn);
            DataSet ds = new DataSet();
            da.Fill(ds, "nrp");

            foreach (DataRow row in ds.Tables["nrp"].Rows)
            {
                string s = row["priorita"].ToString();
                if (s == null) s = string.Empty;

                DataGridViewRow row1 = dataGridView1.Rows[e.RowIndex];
                row1.DefaultCellStyle.BackColor = Color.White;

                switch(s)
                {
                    case a1: row1.DefaultCellStyle.ForeColor = Color.Black; break;
                    case a2: row1.DefaultCellStyle.ForeColor = Color.Blue; break;
                    case a3: row1.DefaultCellStyle.ForeColor = Color.Red; break;
                    default: row1.DefaultCellStyle.ForeColor = Color.DarkSeaGreen; break;
                }
            }
        }
        dataGridView1.ColumnHeadersVisible = false;
        dataGridView1.EnableHeadersVisualStyles = false;
    }
}
Editováno 10.1.2016 16:27
 
Nahoru Odpovědět
10.1.2016 16:26
Avatar
jt.e
Člen
Avatar
jt.e:10.1.2016 16:54

ikdyž vlastně, se switch-em nemusíš použít řádek

if (s == null) s = string.Empty;

switch to vyhodí jako default

Editováno 10.1.2016 16:55
 
Nahoru Odpovědět
10.1.2016 16:54
Avatar
Martin Svoboda:11.1.2016 9:26

tak som to skúsil, ale všetky riadky sú ako default takže darkSeaGreen, no chcem to ešte skúsiť cez MySqlDataReader

Editováno 11.1.2016 9:28
 
Nahoru Odpovědět
11.1.2016 9:26
Avatar
Martin Svoboda:11.1.2016 9:50

ešte pridávam zovšeobecnený obrázok pre lepšiu predstavu. Col1,col2,col3 sa zobrazí v DGV a col8 je "priorita" kde môže byť uložený len jeden z 3 reťazcov a1,a2,a3

Editováno 11.1.2016 9:52
 
Nahoru Odpovědět
11.1.2016 9:50
Avatar
Odpovídá na Martin Svoboda
Michal Štěpánek:11.1.2016 10:46

A když uděláš

int pocetDGV = dataGridView1.Rows.Count;
for(int i = 0; i < pocetDGV; i++)
{
if(DGV.SelectedCells[cislosloupce].value = "a1"
{
DGV.Row[i].DefaultCellStyle.BackColor = Color.White;
DGV.Row[i].DefaultCellStyle.ForeColor = Color.Black;
}
}

?

Editováno 11.1.2016 10:46
Nahoru Odpovědět
11.1.2016 10:46
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Martin Svoboda:11.1.2016 11:08

ja v DGV nemám stĺpec priorita takže takto to nepôjde

if(DGV.SelectedCells[cislosloupce].value = "a1"

prípadne viem si do DGV načítať aj tento stĺpec (takže načítam 4) ale nezobraziť ho?(zobrazené budú 3)

Editováno 11.1.2016 11:10
 
Nahoru Odpovědět
11.1.2016 11:08
Avatar
Odpovídá na Martin Svoboda
Michal Štěpánek:11.1.2016 11:12

Tak si ho tam načti, ale dej mu visible = false;

Nahoru Odpovědět
11.1.2016 11:12
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Martin Svoboda:11.1.2016 12:28

do dgv načítavam dáta takto:

using (MySqlDataAdapter sqlDa = new MySqlDataAdapter("select pc,sprava,datum from nrp", myConnection))
               {
                   DataTable dt = new DataTable();
                   sqlDa.Fill(dt);
                   dataGridView1.DataSource = null;
                   dataGridView1.DataSource = dt;
                   this.dataGridView1.Refresh();
                   dataGridView1.Columns[0].Width = 100;
                   dataGridView1.Columns[1].Width = 270;
                   dataGridView1.Columns[2].Width = 100;
                   dataGridView1.AllowUserToAddRows = false;
                   dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.RowCount - 1;

viem pridať a skryť 4 stĺpec takto:

using (MySqlDataAdapter sqlDa = new MySqlDataAdapter("select pc,sprava,datum,priorita from nrp", myConnection))
               {
                   DataTable dt = new DataTable();
                   sqlDa.Fill(dt);
                   dataGridView1.DataSource = null;
                   dataGridView1.DataSource = dt;
                   this.dataGridView1.Refresh();
                   dataGridView1.Columns[0].Width = 100;
                   dataGridView1.Columns[1].Width = 270;
                   dataGridView1.Columns[2].Width = 100;
                   dataGridView1.Columns[3].Visible = false;
                   dataGridView1.AllowUserToAddRows = false;
                   dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.RowCount - 1;
 
Nahoru Odpovědět
11.1.2016 12:28
Avatar
Odpovídá na Martin Svoboda
Michal Štěpánek:11.1.2016 15:10

No, a když už ho tam máš, můžeš zkusit to, co jsem ti radil...
EDIT: jen trošku nechápu, proč tam máš to

dataGridView1.DataSource = null;
dataGridView1.DataSource = dt;
Editováno 11.1.2016 15:11
Nahoru Odpovědět
11.1.2016 15:10
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
jt.e
Člen
Avatar
Odpovídá na Martin Svoboda
jt.e:11.1.2016 17:28

když je všechno default, tak nejspíš špatně načítáš databázi. Jak pracovat MySql ti neporadím, protože to ještě neumím. Jen můžu poradit F9, aplikaci krokovat a pozorovat co se děje.

 
Nahoru Odpovědět
11.1.2016 17:28
Avatar
Martin Svoboda:14.1.2016 8:21

nefunguje to ani tak ... skúsil som si načítať do DGV aj stĺpec priorita a vyberal som priamo z DGV

int rowc = dataGridView1.Rows.Count - 1;
           for (int i = 0; i <= rowc; i++)
           {
               if (dataGridView1.Rows[i].Cells[3].Value.ToString() == a1)
               {
                   for (int z = 0; z <= dataGridView1.ColumnCount - 1; z++)
                   {
                       dataGridView1.Rows[i].Cells[z].Style.ForeColor = Color.Black;
                   }
               }
               else if (dataGridView1.Rows[i].Cells[3].Value.ToString() == a2)
               {
                   for (int z = 0; z <= dataGridView1.ColumnCount - 1; z++)
                   {
                       dataGridView1.Rows[i].Cells[z].Style.ForeColor = Color.Blue;
                   }
               }
               else if (dataGridView1.Rows[i].Cells[3].Value.ToString() == a3)
               {
                   for (int z = 0; z <= dataGridView1.ColumnCount - 1; z++)
                   {
                       dataGridView1.Rows[i].Cells[z].Style.ForeColor = Color.Red;
                   }
               }
           }

no ani tak mi to nefunguje ...

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
14.1.2016 8:21
Avatar
Odpovídá na Martin Svoboda
Michal Štěpánek:14.1.2016 9:50

Ještě dotaz, nezkoušíš náhodou nastavovat barvy ještě před tím, než se stihne ten DGV naplnit? Zkus třeba tu proceduru obarvování spustit přes tlačítko až po naplnění DGV, co to udělá?

Editováno 14.1.2016 9:51
Nahoru Odpovědět
14.1.2016 9:50
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Martin Svoboda:14.1.2016 19:27

tak beriem späť tento môj pokus funguje, ale pri prerábaní servera som si zle nastavil mysql
Takže ak by niekto potreboval, tak toto funguje:

int rowc = dataGridView1.Rows.Count - 1;
           for (int i = 0; i <= rowc; i++)
           {
               if (dataGridView1.Rows[i].Cells[3].Value.ToString() == a1)
               {
                   for (int z = 0; z <= dataGridView1.ColumnCount - 1; z++)
                   {
                       dataGridView1.Rows[i].Cells[z].Style.ForeColor = Color.Black;
                   }
               }
               else if (dataGridView1.Rows[i].Cells[3].Value.ToString() == a2)
               {
                   for (int z = 0; z <= dataGridView1.ColumnCount - 1; z++)
                   {
                       dataGridView1.Rows[i].Cells[z].Style.ForeColor = Color.Blue;
                   }
               }
               else if (dataGridView1.Rows[i].Cells[3].Value.ToString() == a3)
               {
                   for (int z = 0; z <= dataGridView1.ColumnCount - 1; z++)
                   {
                       dataGridView1.Rows[i].Cells[z].Style.ForeColor = Color.Red;
                   }
               }
           }

tak a ešte by ste mi nevedeli pomôcť aj s druhým mojím problémom?
http://www.itnetwork.cz/…68cf0c6d50e8

 
Nahoru Odpovědět
14.1.2016 19:27
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 25 zpráv z 25.