Předvánoční Black Friday Předvánoční Black Friday
Až 80% zdarma! Předvánoční BLACK FRIDAY akce. Více informací

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. července 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. července 18:44
Avatar
Fenrix
Člen
Avatar
Odpovídá na Frantisek Jesatko
Fenrix:8. července 20:49

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

 
Nahoru Odpovědět 8. července 20:49
Avatar
Frantisek Jesatko:8. července 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. července 21:04
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Frantisek Jesatko
vajkuba1234:9. července 5:15

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

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

pouze sirku sloupce

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

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

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

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

 
Nahoru Odpovědět 9. července 13:41
Avatar
vajkuba1234
Člen
Avatar
vajkuba1234:9. července 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. července 14:07
Nahoru Odpovědět 9. července 14:06
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
Odpovídá na vajkuba1234
Frantisek Jesatko:9. července 14:37

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

 
Nahoru Odpovědět 9. července 14:37
Avatar
Ghst
Člen
Avatar
Ghst:9. července 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. července 17:16
 
Nahoru Odpovědět 9. července 17:14
Avatar
Odpovídá na Ghst
Frantisek Jesatko:9. července 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. července 20:31
Avatar
don.jarducius:9. července 21:34

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

 
Nahoru Odpovědět  ±0 9. července 21:34
Avatar
Ghst
Člen
Avatar
Odpovídá na Frantisek Jesatko
Ghst:10. července 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. července 8:02
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Ghst
vajkuba1234:10. července 14:23

Dle nadpisu by asi radeji Linq.

Nahoru Odpovědět 10. července 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. července 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. července 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. července 14:59

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

 
Nahoru Odpovědět 10. července 14:59
Avatar
Odpovídá na vajkuba1234
don.jarducius:10. července 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. července 17:49
Avatar
Odpovídá na vajkuba1234
don.jarducius:10. července 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. července 17:56
Avatar
Odpovídá na don.jarducius
Frantisek Jesatko:10. července 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. července 18:07
Avatar
Odpovídá na vajkuba1234
Frantisek Jesatko:10. července 18:09

ano cele se to snazim delat s linq

 
Nahoru Odpovědět 10. července 18:09
Avatar
Odpovídá na vajkuba1234
Frantisek Jesatko:10. července 18:12

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

 
Nahoru Odpovědět 10. července 18:12
Avatar
Frantisek Jesatko:10. července 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. července 18:14
Avatar
Odpovídá na Frantisek Jesatko
don.jarducius:10. července 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. července 20:06
Avatar
Odpovídá na don.jarducius
Frantisek Jesatko:12. července 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. července 7:54
Avatar
Odpovídá na Frantisek Jesatko
don.jarducius:13. července 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. července 8:07
 
Nahoru Odpovědět 13. července 8:06
Avatar
Odpovídá na Frantisek Jesatko
don.jarducius:13. července 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. července 8:11
Avatar
Odpovídá na don.jarducius
Frantisek Jesatko:13. července 10:20

diky moc vzhledem k tomu ze pouzivam linq potrebuju XElement .

 
Nahoru Odpovědět 13. července 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.