Diskuze: Linq nový záznam
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 27 zpráv z 27.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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 .
Co obsahuje "gridy"? A co obsahuje "sloupec"? Zajima me obsah tech trid...
pouze sirku sloupce
Fajn, tak sem zkopiruj obsah tech trid pomoci tlacitka "code" a pouzij tlacitko odpovedet.
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.
gridy = tabulka z db ktera ma sloupce o nazvu id, nazev, sloupec1 az sloupec20.
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
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
Ahoj,
to co hledáš se jmenuje reflexe. Např. StackOverflow
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
Co jsi nepochopil na tom, ze chci videt obsah tech trid? Ja nechci, abys mi to popsal slovy.
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í.
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.
omlouvam se za minus nejak se tam primotal reflexe je opravdu super reseni z casti uz mi to chodi diky
gridy je table v db ktera obsahuje sloupce pod nazvem sloupec1-20.
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 .
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:
Případně lze serializovat i do JSON formátu, ten je úspornější co se velikosti týče.
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");
Č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();
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");
diky moc vzhledem k tomu ze pouzivam linq potrebuju XElement .
Zobrazeno 27 zpráv z 27.