Avatar
Martin Svoboda:

Č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. ledna 14:39
 
Odpovědět 9. ledna 14:36
Avatar
Odpovídá na Martin Svoboda
Michal Štěpánek:

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

string s = LISTpriorita[0];

bude vždycky "a1" ne?

Nahoru Odpovědět 9. ledna 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:

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. ledna 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:

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. ledna 9:13
 
Nahoru Odpovědět 10. ledna 9:10
Avatar
Martin Svoboda:

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. ledna 9:22
Avatar
Odpovídá na Martin Svoboda
Michal Štěpánek:

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. ledna 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:

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. ledna 15:01
Avatar
jt.e
Člen
Avatar
Odpovídá na Martin Svoboda
jt.e:

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. ledna 15:36
Avatar
Odpovídá na jt.e
Martin Svoboda:

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. ledna 15:41
Avatar
jt.e
Člen
Avatar
Odpovídá na Martin Svoboda
jt.e:

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. ledna 15:52
 
Nahoru Odpovědět 10. ledna 15:51
Avatar
Martin Svoboda:

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. ledna 16:02
Avatar
Odpovídá na Martin Svoboda
Michal Štěpánek:

Co vlastně se ti zobrazuje v tom DGV?

Editováno 10. ledna 16:18
Nahoru Odpovědět 10. ledna 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:

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. ledna 16:27
 
Nahoru Odpovědět 10. ledna 16:26
Avatar
jt.e
Člen
Avatar
jt.e:

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

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

switch to vyhodí jako default

Editováno 10. ledna 16:55
 
Nahoru Odpovědět 10. ledna 16:54
Avatar
Martin Svoboda:

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. ledna 9:28
 
Nahoru Odpovědět 11. ledna 9:26
Avatar
Martin Svoboda:

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. ledna 9:52
 
Nahoru Odpovědět 11. ledna 9:50
Avatar
Odpovídá na Martin Svoboda
Michal Štěpánek:

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. ledna 10:46
Nahoru Odpovědět 11. ledna 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:

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. ledna 11:10
 
Nahoru Odpovědět 11. ledna 11:08
Avatar
Odpovídá na Martin Svoboda
Michal Štěpánek:

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

Nahoru Odpovědět 11. ledna 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:

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. ledna 12:28
Avatar
Odpovídá na Martin Svoboda
Michal Štěpánek:

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. ledna 15:11
Nahoru Odpovědět 11. ledna 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:

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. ledna 17:28
Avatar
Martin Svoboda:

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. ledna 8:21
Avatar
Odpovídá na Martin Svoboda
Michal Štěpánek:

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. ledna 9:51
Nahoru Odpovědět 14. ledna 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:

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. ledna 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.