Avatar
Maros2470
Člen
Avatar
Maros2470:7.5.2014 12:30

Potřeboval bych poradit. Mám načtená data ze dvou tabulek do DataSet a potřebuji je vypsat do dataGrid. Zatím vypisuji jednu tabulku do dataGrid. Mám to napsáno takto:

string connectionString = @"Data Source=PCMAREK\E­li;Initial Catalog=Eli-elektro;Integrated Security=True";
using (SqlConnection pripojeni = new SqlConnection(con­nectionString))
{

SqlCommand prikazPredvolba = new SqlCommand();
prikazPredvol­ba.Connection = pripojeni;
prikazPredvol­ba.CommandText = "SELECT * FROM PredvolbaTel";
SqlCommand prikazPsc = new SqlCommand();
prikazPsc.Con­nection = pripojeni;
prikazPsc.Com­mandText = "SELECT * FROM Psc";

SqlDataAdapter dataAdapterPred­volba = new SqlDataAdapter();
dataAdapterPred­volba.SelectCom­mand = prikazPredvolba;

SqlDataAdapter dataAdapterPsc = new SqlDataAdapter();
dataAdapterPsc­.SelectCommand = prikazPsc;

DataSet datSadaPredvolby = new DataSet();
dataAdapterPred­volba.Fill(dat­SadaPredvolby, "PredvolbaTel");
DataSet datSadaPsc = new DataSet();
dataAdapterPsc­.Fill(datSada­Predvolby, "Psc");

{
foreach (DataRow radek in datSadaPredvol­by.Tables["Pred­volbaTel"].Row­s)

predvolbyData­Grid.Rows.Add(ra­dek["Id"], radek["Predvolba"], radek["Zeme"]);

}

}

Nevím, ale jak to udělat, aby se mi data z obou dataSetů načetla do jednoho dataGrid vedle sebe. Případně jak určit, do kterých sloupců v Gridu se mi mají načíst určitá data z dataSet.

 
Odpovědět 7.5.2014 12:30
Avatar
Odpovídá na Maros2470
Nikola Sterziková (PaNika):7.5.2014 12:54

No, záleží na co to má být.
Pokud chceš zobrazit data ze 2 tabulek v jednom gridView, tak doporučuji na úrovni SQL udělat třeba LEFT (či RIGTH) OUTER JOIN (případně FULL OUTER JOIN , podle situace)
např:

SELECT *
     FROM PredvolbaTel
          LEFT OUTER JOIN  Psc
               ON PredvolbaTel.ID = Psc.PredvolbaTelID

Pak ve vlastnostech GridView můžeš použít AutoGenerateCo­lumns. Pokud je True, automaticky ti vygeneruje sloupce podle sloupců tabulky z databáze.
Nebo (což je praktičtější pro uživatele) nastavíš AutoGenerateCo­lumns="false" a pak přidáš sloupce ručně (případně v designéru):

<asp:GridView ID="Predvolby" runat="server" AutoGenerateColumns="False" DataKeyNames="PredvolbaID">
        <Columns>
                <asp:BoundField DataField="Predvolba" HeaderText="Předvolba telefonního čísla" />
        </Columns>

</asp:GridView>
 
Nahoru Odpovědět 7.5.2014 12:54
Avatar
Maros2470
Člen
Avatar
Odpovídá na Nikola Sterziková (PaNika)
Maros2470:7.5.2014 13:20

Příklad, který jsem uvedl, není to pravé ořechové. Dám jiný přehlednější.

Mám např. tabulku Firma ( Id, Firma, Ulice, PscId) a dále tabulku Psc (Id, Obec, CastObce, Psc).

Na form potřebuji v jednom dataGrid zobrazit: Id, Firma, Ulice, PSCId, Obec, CastObce, Psc) Oboje Id bude následně visible = false.

Tohle asi bude srozumitelnější. Píši to C# a databázi mám MS-SQL 2008 Expres.

Editováno 7.5.2014 13:23
 
Nahoru Odpovědět 7.5.2014 13:20
Avatar
Odpovídá na Maros2470
Nikola Sterziková (PaNika):7.5.2014 13:33

Pak tedy SQL bude vypadat takto:

SELECT F.Id, F.Firma, F.Ulice, F.PSCId, P.Obec, P.CastObce, P.Psc
     FROM Firma F
          LEFT OUTER JOIN Psc P
               ON F.PSCId = P.ID

No a v GridView to už bude jak jsem psala prve.
(Doporučuji používat vlastnost DataKeyNames, kam se dává Id záznamu. Lepe se pak s tím pracuje později v C#.)
Tedy:

<asp:GridView ID="Firmy" runat="server" AutoGenerateColumns="False" DataKeyNames="ID">
        <Columns>
                <asp:BoundField DataField="Firma" HeaderText="Název firmy" />
                <asp:BoundField DataField="Ulice" HeaderText="Ulice" />
                ...
                <asp:BoundField DataField="Id" Visible="false" />
        </Columns>

</asp:GridView>
 
Nahoru Odpovědět 7.5.2014 13:33
Avatar
Maros2470
Člen
Avatar
Odpovídá na Nikola Sterziková (PaNika)
Maros2470:7.5.2014 14:44

Ještě jedna, možná hloupá otázka, jak otevřu ten designer? Já ho zatím nepoužíval. Mám VS2010 Profi. Dík

 
Nahoru Odpovědět 7.5.2014 14:44
Avatar
Odpovídá na Maros2470
Michal Štěpánek:7.5.2014 15:28

Ve VS si můžeš vybrat zobrazení dole pod kódem (zdroj - designer(návrh) - split)

Nahoru Odpovědět 7.5.2014 15:28
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Maros2470
Člen
Avatar
Odpovídá na Nikola Sterziková (PaNika)
Maros2470:7.5.2014 19:58

Tak už mi to funguje. Mám ještě jeden dotaz, když budu takhle spojovat více tabulek, lze zadat vícekrát rovnost jednotlivých buněk (ON F.PscId = P.ID) a případně jak se oddělují od sebe. Já bych to viděl čárkou, nebo středníkem (ON F.PscId = P.ID, BankId = BankaId)?

 
Nahoru Odpovědět 7.5.2014 19:58
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Maros2470
Jan Vargovský:7.5.2014 20:13

AND nebo OR :)

 
Nahoru Odpovědět  +1 7.5.2014 20:13
Avatar
Odpovídá na Maros2470
Michal Štěpánek:7.5.2014 20:57

když si dáš v designeru konfiguraci datového zdroje, můžeš si tam toto spojení více tabulek naklikat a on ti z toho vyplivne, jak má výsledný SQL dotaz vypadat, ale rozhodně to nelze spojovat čárkou ani středníkem, protože je to v podstatě podmínka a tam platí buď všechny ("AND") nebo jen některé ("OR") :-)

Nahoru Odpovědět 7.5.2014 20:57
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Maros2470
Nikola Sterziková (PaNika):7.5.2014 21:51

Tak to jsem ráda, že ti to funguje ;-)
Na další spojení bys měl psát další JOIN
např.

FROM Firma F
          LEFT OUTER JOIN Psc P
               ON F.PSCId = P.ID
          LEFT OUTER JOIN BanovniUcet B
               ON B.ID = F.BankovniUcetID

Možná zkus mrknout na nějaké články o SQL...

 
Nahoru Odpovědět 7.5.2014 21:51
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 11 zpráv z 11.