Black friday Black friday
Aprílový black friday tě nenechá v klidu! Až 80 % prémiového obsahu zdarma. Více informací
Pouze tento týden slevy až 80 % na programování v Javě

Diskuze: Linq nový záznam

C# .NET .NET (C# a Visual Basic) Linq nový záznam American English version English version

Aktivity (3)
Avatar
Frantisek Jesatko:8.7.2018 18:44

Ahoj potřebuji radu mám tabulku kde jsou sloupce pojmenované sloupec1,sloupec2 az 20.
Potřebuji přidat záznam ,ale nechce se mi vypisovat kod pro všech 20 sloupců.
Bohužel nemůžu přijít na to jak do nazvu sloupce přidat index.

gridy adr = new gridy();
               for (int i = 1; i < 20; i++)
               {

                   if (i <= grd_uni.ColumnCount)
                   {
                   //    string jmeno = "adr.sloupec" + i.ToString(); nefunguje

                       (adr.sloupec + i.ToString()) = grd_uni.Columns[i - 1].Width.ToString();
                   }
                   }

                       MessageBox.Show(adr.ToString());
                       db_set.gridies.InsertOnSubmit(adr);
                      db_set.SubmitChanges();

                   MessageBox.Show("uloženo");

Zkusil jsem: Na webu jsem nic nenašel

Chci docílit: Snažím se uložit šířku sloupců datagridu do db. Kde maximální počet sloupců je 20 ale není u všech gridů stejný .

 
Odpovědět 8.7.2018 18:44
Avatar
Fenrix
Člen
Avatar
Odpovídá na Frantisek Jesatko
Fenrix:8.7.2018 20:49

použij spíš foreach místo for :)

 
Nahoru Odpovědět 8.7.2018 20:49
Avatar
Frantisek Jesatko:8.7.2018 21:04

foreach je možná lepší ale můj problém neřeší. Potřebuju vygenerovat adr.sloupec1 a tu jedničku tam nějak dostat z proměnné i. Bohužel nejde mi to .

 
Nahoru Odpovědět 8.7.2018 21:04
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Frantisek Jesatko
vajkuba1234:9.7.2018 5:15

Co obsahuje "gridy"? A co obsahuje "sloupec"? Zajima me obsah tech trid...

Nahoru Odpovědět 9.7.2018 5:15
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
Frantisek Jesatko:9.7.2018 5:41

pouze sirku sloupce

 
Nahoru Odpovědět 9.7.2018 5:41
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Frantisek Jesatko
vajkuba1234:9.7.2018 9:40

Fajn, tak sem zkopiruj obsah tech trid pomoci tlacitka "code" a pouzij tlacitko odpovedet.

Nahoru Odpovědět 9.7.2018 9:40
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
jozef_i
Člen
Avatar
jozef_i:9.7.2018 13:41

Možno by sa dalo použiť adr.ElementAt(i)=hod­nota_sirky .

 
Nahoru Odpovědět 9.7.2018 13:41
Avatar
vajkuba1234
Člen
Avatar
vajkuba1234:9.7.2018 14:06

A co takhle mit tridu Grid, ktera bude obsahovat kolekci objektu typu Sloupec? Sloupec bude mimo jine obsahovat i svou sirku a treba nazev nebo nejake ID. Kazdopadne se ti s tim tak bude lepe nejen vyhledavat, ale i pracovat.

Editováno 9.7.2018 14:07
Nahoru Odpovědět 9.7.2018 14:06
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
Odpovídá na vajkuba1234
Frantisek Jesatko:9.7.2018 14:37

gridy = tabulka z db ktera ma sloupce o nazvu id, nazev, sloupec1 az sloupec20.

 
Nahoru Odpovědět 9.7.2018 14:37
Avatar
Ghst
Člen
Avatar
Ghst:9.7.2018 17:14

Najdi si v referenci pojmy DataTable, DataRow, DataColumn...

 DataTable table = new DataTable();

//naplníš si ji bud pomocí třídy DataAdapter(respektive hlavně načteš strukturu)
//eventuelně můžeš ručně

    cId= new DataColumn();
    cId.DataType = System.Type.GetType("System.Int32");
    cId.ColumnName = "id";
    table.Columns.Add(cId);

    cName= new DataColumn();
    cName.DataType = System.Type.GetType("System.String");
    cName.ColumnName = "Nazev";
    table.Columns.Add(cName);

//chceš přidávat řádky
    for(int i = 0; i < 10; i++)
    {
        row = table.NewRow();
        row["id"] = i;
        row["Nazev"] = "item " + i.ToString();
        table.Rows.Add(row);
    }

//nebo iterovat?
foreach(DataRow rowin DataTable.Rows)
    for(int i = 0; i < 10; i++)
    {
        Log.Console(row["Nazev"]);
                 row["sloupec"+i.ToString()] = "Hou hou";
    }

Snad sem správně pochopil, o co ti jde

Editováno 9.7.2018 17:16
 
Nahoru Odpovědět 9.7.2018 17:14
Avatar
Odpovídá na Ghst
Frantisek Jesatko:9.7.2018 20:31

Toto je urcite dobra pomoc funguje vse ikdyz mam strukturu tabulky uz vytvorenou v db ? misto DataTable table = new DataTable() ;
muzu pouzit tablezDb table = new tablezDb(); ?
diky

 
Nahoru Odpovědět 9.7.2018 20:31
Avatar
don.jarducius:9.7.2018 21:34

Ahoj,
to co hledáš se jmenuje reflexe. Např. StackOverflow

 
Nahoru Odpovědět  ±0 9.7.2018 21:34
Avatar
Ghst
Člen
Avatar
Odpovídá na Frantisek Jesatko
Ghst:10.7.2018 8:02

Ano můžeš plnit objekt DataTable, ale není to tak jednoduché, jak píšeš:

SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM MojeTabluka", DbConnectionString);
DataTable datatable = new DataTable();
adapter.Fill(datatable);
//pak DataTable odpovídá struktuře existující tabulky v DB
datatable [0]["MujSloupecek"] = "xy";   //pokud tabulka nema "MujSloupecek" skonci to chybou
 
Nahoru Odpovědět 10.7.2018 8:02
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Ghst
vajkuba1234:10.7.2018 14:23

Dle nadpisu by asi radeji Linq.

Nahoru Odpovědět 10.7.2018 14:23
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Frantisek Jesatko
vajkuba1234:10.7.2018 14:25

Co jsi nepochopil na tom, ze chci videt obsah tech trid? Ja nechci, abys mi to popsal slovy.

Nahoru Odpovědět 10.7.2018 14:25
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
Ghst
Člen
Avatar
Odpovídá na vajkuba1234
Ghst:10.7.2018 14:59

To je možné, to pak není problém použít LINQ to SQL.

 
Nahoru Odpovědět 10.7.2018 14:59
Avatar
Odpovídá na vajkuba1234
don.jarducius:10.7.2018 17:49

Můžu vědět, za co ten mínus?
Shrňme si to: chce použít LINQ proti DB, nechce se mu ale při obsluze v kódu vypisovat všechny proměnný, strukturu už má v DB vytvořenou - tzn. použije DB First a kód entit mu VS vygeneruje. Reflexe je tudíž elegantní řešení.

 
Nahoru Odpovědět 10.7.2018 17:49
Avatar
Odpovídá na vajkuba1234
don.jarducius:10.7.2018 17:56

O jeho návrhu řešení problematiky ukládání šířky sloupců se nebavím, ta je velmi nešťastná. Lepší by bylo použít serializaci a výsledek pak uložit do db.

 
Nahoru Odpovědět 10.7.2018 17:56
Avatar
Odpovídá na don.jarducius
Frantisek Jesatko:10.7.2018 18:07

omlouvam se za minus nejak se tam primotal reflexe je opravdu super reseni z casti uz mi to chodi diky

 
Nahoru Odpovědět 10.7.2018 18:07
Avatar
Odpovídá na vajkuba1234
Frantisek Jesatko:10.7.2018 18:09

ano cele se to snazim delat s linq

 
Nahoru Odpovědět 10.7.2018 18:09
Avatar
Odpovídá na vajkuba1234
Frantisek Jesatko:10.7.2018 18:12

gridy je table v db ktera obsahuje sloupce pod nazvem sloupec1-20.

 
Nahoru Odpovědět 10.7.2018 18:12
Avatar
Frantisek Jesatko:10.7.2018 18:14

cele toto tema je o tom ze mam v aplikaci 50 gridu mozna vic a potrebuju sirky sloupcu nastavovat podle toho jak si uzivatel zvoli. do ted co grid to xml . spousta souboru z meho pohledu nic moc pro ta db a linq .

 
Nahoru Odpovědět 10.7.2018 18:14
Avatar
Odpovídá na Frantisek Jesatko
don.jarducius:10.7.2018 20:06

V tom případě by šlo si nastavení gridů ukládat nadále jako XML s tím rozdílem že si XML uložíš do databáze do sloupce typu XML. Modifikace aplikace by byla v celku malá a má to pár výhod:

  • tabulka nebude mít milión sloupců
  • pokud u některého z gridů přidáš sloupec, nemusíš do tabulky s nastavením přidávat další sloupec
  • MSSQL umí pracovat pomocí xQuery s XML přímo, to ale asi nevyužiješ.

Případně lze serializovat i do JSON formátu, ten je úspornější co se velikosti týče.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 10.7.2018 20:06
Avatar
Odpovídá na don.jarducius
Frantisek Jesatko:12.7.2018 7:54

Tak jsem se pustil do uložení xml do db . Z hlediska rozšíření to bude jistě lepší. Nastavil jsem datový typ v tabulce na xml a at delam co delam tak mi to porad na konci skriptu píse neplatná data v radku 1 na pozici 1. Prosím jeste o radu.

var stream = new MemoryStream();


           using (XmlWriter settingwriter = XmlWriter.Create(stream))
           {
             //  settingwriter.WriteStartDocument();
               settingwriter.WriteStartElement(dgv.Name);
               int count = dgv.Columns.Count;

               waitScreen.Show("zapisuji", 200);
               //count the gridview column
               for (int i = 0; i < count; i++)
               {

                   //now create the column root node
                   settingwriter.WriteStartElement("column");
                   //then creat the name node and fill the value in this node
                   settingwriter.WriteStartElement("Name");
                   settingwriter.WriteString(dgv.Columns[i].Name);
                   // close the name node
                   settingwriter.WriteEndElement();
                   //these three node are declared similar to previous node
                   settingwriter.WriteStartElement("width");
                   settingwriter.WriteString(dgv.Columns[i].Width.ToString());
                   settingwriter.WriteEndElement();
                   settingwriter.WriteStartElement("headertext");
                   settingwriter.WriteString(dgv.Columns[i].HeaderText);
                   settingwriter.WriteEndElement();
                   settingwriter.WriteStartElement("displayindex");
                   settingwriter.WriteString(dgv.Columns[i].DisplayIndex.ToString());
                   settingwriter.WriteEndElement();
                   settingwriter.WriteStartElement("visible");
                   settingwriter.WriteString(dgv.Columns[i].Visible.ToString());
                   settingwriter.WriteEndElement();
                   //end the column node
                   settingwriter.WriteEndElement();
               }
               //end the main root of the xml file which is datagrid name
               settingwriter.WriteEndElement();
               //end the settingwritter
               //  settingwriter.WriteEndDocument();
               settingwriter.Flush();
               settingwriter.Close();
           }
           string strXml = System.Text.UTF8Encoding.UTF8.GetString(stream.ToArray());
           // tady to končí
          var xmlTree = new XElement(dgv.Name, XElement.Parse(strXml));


           gridy g = new gridy();

           g.nazev = local_agenda;
           g.sloupec1 = xmlTree;
           db_set.SubmitChanges();
           MessageBox.Show("upraveno");
 
Nahoru Odpovědět 12.7.2018 7:54
Avatar
Odpovídá na Frantisek Jesatko
don.jarducius:13.7.2018 8:06

Čteš celý XML, měl by jsi použít XDocument namísto XElementu na parsování dat. Trochu jsem ti ten kód upravil.

waitScreen.Show("zapisuji", 200);
XDocument xml = new XDocument(
    new XDeclaration("1.0", "utf-8", "yes"),
    new XElement(dgv.Name,
        dgv.Columns.OfType<DataGridViewColumn>().Select(x =>
        new XElement("column",
            new XElement("Name", x.Name),
            new XElement("width", x.Width),
            new XElement("headertext", x.HeaderText),
            new XElement("displayindex", x.DisplayIndex),
            new XElement("visible", x.Visible))
            )
    )
);
var strXml = xml.ToString();
var xmlTree = XDocument.Parse(strXml).Elements().First();
Editováno 13.7.2018 8:07
 
Nahoru Odpovědět 13.7.2018 8:06
Avatar
Odpovídá na Frantisek Jesatko
don.jarducius:13.7.2018 8:11

Resp. takhle

 waitScreen.Show("zapisuji", 200);
 XDocument xml = new XDocument(
     new XDeclaration("1.0", "utf-8", "yes"),
     new XElement(dgv.Name,
         dgv.Columns.OfType<DataGridViewColumn>().Select(x =>
         new XElement("column",
             new XElement("Name", x.Name),
             new XElement("width", x.Width),
             new XElement("headertext", x.HeaderText),
             new XElement("displayindex", x.DisplayIndex),
             new XElement("visible", x.Visible))
             )
     )
 );
 var strXml = xml.ToString();

gridy g = new gridy();
g.nazev = local_agenda;
g.sloupec1 = strXml;
db_set.SubmitChanges();
MessageBox.Show("upraveno");
 
Nahoru Odpovědět 13.7.2018 8:11
Avatar
Odpovídá na don.jarducius
Frantisek Jesatko:13.7.2018 10:20

diky moc vzhledem k tomu ze pouzivam linq potrebuju XElement .

 
Nahoru Odpovědět 13.7.2018 10:20
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 27 zpráv z 27.