Entwickler-Ecke
WinForms - Die Operation '=' kann nicht an System.String und System.Int
moori64 - Mo 19.12.11 01:29
Titel: Die Operation '=' kann nicht an System.String und System.Int
Hallo,
ich habe das ganze Wochenende wieder damit zugebracht um mir Wissen anzueignen.
Stolpere aber immer noch über diese Zuweisung.
Dann habe ich noch eine Frage
Wenn ich eine Datenbanktabelle an eine Combobox binde und an ein Datagrid
wie kann ich es mit C Sharp mitteln verhindern das in der combobox doppelte Einträge vorkommen ?
Wie kann ich eine Combobox so bearbeiten das sie mir bei Bedarf Vor und Zuname anzeigt bei eine klick auf einen Button soll man immer wechseln können.
Wenn ich debugge bekomme ich die oben genannte Fehlermeldung.
C#-Quelltext
1: 2: 3: 4: 5:
| private void cmbkneipe_SelectedIndexChanged(object sender, EventArgs e) { DataTable dt = dgvergebniss.DataSource as DataTable; int id = (int)cmbkneipe.SelectedIndex; <---------- eigentlich ja schon hier , da dort die zuweisung gemacht wird. dt.DefaultView.RowFilter = "Kneipe = " + id; <---------- hier tritt der Fehler auf. |
mats74 - Mo 19.12.11 09:09
Hallo moori64
moori64 hat folgendes geschrieben : |
... wie kann ich es mit C Sharp mitteln verhindern das in der combobox doppelte Einträge vorkommen? |
... indem Du die Itemseinträge vor dem Einfügen in die CB auf Eindeutigkeit überprüfst.
Entweder beim Durchlaufen einer List<string> oder in der Tabelle selber.
Am Besten verhinderst Du doppelte Einträge auf der DB-Tabelle.
moori64 hat folgendes geschrieben : |
Wie kann ich eine Combobox so bearbeiten das sie mir bei Bedarf Vor und Zuname anzeigt ... |
... indem Du die Items entsprechend auswechselst?
Zu deiner 3. Frage (!), folgender Code funktioniert:
C#-Quelltext
1: 2: 3: 4:
| DataTable dt = new DataTable("Hallo"); dt.Columns.Add("Kneipe"); int id = (int)comboBox1.SelectedIndex; dt.DefaultView.RowFilter = "Kneipe = " + Convert.ToString(id); |
Wenn dies nicht funktionieren sollte, liegt es am dgvergebniss oder an der Selektion des Items in deiner CB.
moori64 - Mo 19.12.11 11:41
Hallo;
was soll denn da nicht stimmen ?
Es müsste doch eigentlich funktionieren.
Ich habe doch nur eine Datenbanktabelle und an die Comboboxen füge ich die Felder zu nachdem ich selektieren will.
das einzigste was ich mir schwer vorgestellt hatte war das ich dies mit mehreren comboboxen immer weiter einschränken wollte nach gaststätte und kunde usw.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| { SqlConnection conn = new SqlConnection(connstr); SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Lokal ", conn); DataTable dt = new DataTable(); da.Fill(dt); dgvergebniss.DataSource = dt; cmbkneipe.DataSource = dt; cmbkneipe.DisplayMember = "Kneipe"; cmbkneipe.ValueMember = "id"; }
private void cmbkneipe_SelectedIndexChanged(object sender, EventArgs e) { DataTable dt = dgvergebniss.DataSource as DataTable; int id = (int)cmbkneipe.SelectedIndex; dt.DefaultView.RowFilter = "Kneipe = " + Convert.ToString(id);
dgvergebniss.DataSource = dt.DefaultView; } |
Th69 - Mo 19.12.11 21:06
Hallo Uwe,
von welchem Typ ist denn die Tabellenspalte 'Kneipe' der von deinem DataGridView referenzierten Tabelle?
Nach meinem Verständnis sollte diese Spalte doch auf die Tabelle "Lokal" verweisen (d.h. dessen Id-Feld) und von Typ 'int' sein, oder? (daher wäre 'LokalId' vllt. der bessere Spaltenname.)
Bezogen auf den Beitrag
http://www.c-sharp-forum.de/viewtopic.php?p=655828#655828 muß ich gestehen, daß ich dir die falsche Eigenschaft genannt habe.
Korrekt wäre
C#-Quelltext
1:
| int id = (int)cmbkneipe.SelectedValue; |
um die Id zu erhalten (denn im Vergleich zu SelectedIndex: der ComboBox-Index muß ja nicht zwangsläufig gleich mit der Tabellen-Id sein).
SelectedItem gibt dir das gesamte gebundene Item an (d.h. bei einer DataTable erhältst du eine DataRow zurück):
C#-Quelltext
1: 2: 3: 4: 5: 6:
| DataRow row = cmbkneipe.SelectedItem as DataRow; if (row != null) { string firstColumnEntry = row[0].ToString(); } |
P.S. Die Fehlermeldung kommt wahrscheinlich von der RowFilter-Auswertung (der DataView-Komponente), daß 'Kneipe' vom Typ 'string' (bzw. 'varchar' oder 'text' o.ä) ist und dann (so wie bei SQL) der Vergleichswert in einfache Anführungsstriche geschrieben werden muß, z.B.
C#-Quelltext
1:
| dt.DefaultView.RowFilter = "Kneipe = '" + id + "'"; |
Hatte ich dir schon mal Links für DataBinding gegeben?
s.
http://www.c-sharp-forum.de/viewtopic.php?p=640560#640560
bzw. Verweise auf
http://www.c-plusplus.de/forum/p2056421
und besonders
http://www.c-plusplus.de/forum/p2049983
So jetzt kommst du hoffentlich mit deinem Programm (und mit dem Erlernen von .NET) weiter...
moori64 - Mo 19.12.11 21:42
hallo ,
ich lerne ja immer fleißig weiter und bin auch schon auf diese striche gestoßen also habe ich das mal so versucht.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| private void cmbkneipe_SelectedIndexChanged(object sender, EventArgs e) { DataTable dt = dgvergebniss.DataSource as DataTable;
dt.DefaultView.RowFilter = "Kneipe = '" + cmbkneipe.SelectedItem.ToString() + "'"; |
Die Tabelle heißt Lokal
Feld 1 ist Id vom Typ int
Feld 2 Kneipe vom Typ varchar
Feld 3 Kunde vom Typ nvarchar
Feld 4 Umsatz von Typ float
das ist mein momentaner stand ich muss nachher mit mehreren komboboxen arbeiten können und will immer nur den gefilterten wert sehen
bis jetzt ist es mir nur gelungen das ich den Pfeil auf die Auswahl gesetzt habe und ja ich habe alles gelesen aber du weißt ja wie das mit
der theorie so ist. Es gibt ja den spruch das theorie ohne praxis richtungslos ist und das muss ich leider zunehmend merken.
viele grüße uuwe und besten dank für euere bisherige hilfe
Th69 - Di 20.12.11 11:18
Hallo Uwe,
ich bin bisher immer davon ausgegangen, daß du zwei verschiedene Tabellen hast (bzw. noch mehr) und nicht nur eine einzige (denn dies verstößt gegen die
Normalisierung [
http://de.wikipedia.org/wiki/Normalisierung_%28Datenbank%29]).
So wie ich das sehe ist aber auch
cmbkneipe.SelectedItem.ToString() falsch (siehst du ja mit dem Debugger).
Wenn du nur den Text haben willst, dann verwende entweder
cmbkneipe.Text oder aber setze
C#-Quelltext
1:
| cmbkneipe.ValueMember = "Kneipe"; |
und benutze
cmbkneipe.SelectedValue.ToString().
Dann solltest du aber auch für die ComboBox "SELECT DISTINCT * FROM Lokal ORDER BY Kneipe" verwenden, um sortierte, nicht doppelte Einträge zu erhalten.
Ich habe das Gefühl, daß du quasi zwei Baustellen hast: C# und Datenbanken (SQL) - dann wird es natürlich um so schwieriger mit dem Entwickeln.
moori64 - Di 20.12.11 16:04
Hallo,
die doppelten einträge will ich ja nur aus der spalte der combobox raus haben und nicht aus der tabellen spalte.
ich habe jetzt also 2 abfrage gemacht und eine an die combobox gebunden und die andere an das datagrid.
erhalte nun aber die fehlermeldung das er Die Spalte [System.Data.DataRowView nicht findet. ich glaube ich werde mir jetzt mal ein
anderes beispiel aufbauen wo ich die gaststätte auslagere und mit id arbeite mal sehen ob das besser klappt.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| public partial class Form1 : Form { public Form1() { InitializeComponent(); }
DataTable cbdt; SqlDataAdapter cbda; DataTable dgdt; SqlDataAdapter dgda;
private void Form1_Load(object sender, EventArgs e) { string connstr = @"data source=localhost\V2B;user id=sa;password=moori64;integrated security=false;" + "persist security info=false;initial catalog=gaststaetten"; SqlConnection conn = new SqlConnection(connstr);
cbda = new SqlDataAdapter("SELECT DISTINCT Kneipe FROM Lokal ORDER BY Kneipe ", conn); cbdt = new DataTable();
dgda = new SqlDataAdapter("SELECT * FROM Lokal ", conn); dgdt = new DataTable();
cbda.Fill(cbdt); dgda.Fill(dgdt); dgvergebniss.DataSource = dgdt; cmbkneipe.DataSource = cbdt; cmbkneipe.DisplayMember = "Kneipe"; cmbkneipe.ValueMember = "Kneipe"; }
private void cmbkneipe_SelectedIndexChanged(object sender, EventArgs e) { dgdt.DefaultView.RowFilter = "Kneipe = " + cmbkneipe.SelectedValue.ToString(); dgvergebniss.DataSource = dgdt.DefaultView; } } } |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!