Autor Beitrag
moori64
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: Mo 19.12.11 01:29 
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.



ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Mo 19.12.11 09:09 
Hallo moori64
user profile iconmoori64 hat folgendes geschrieben Zum zitierten Posting springen:
... 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.

user profile iconmoori64 hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden 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.

_________________
Gruss
mats74
moori64 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 www.c-sharp-forum.de....php?p=655828#655828 muß ich gestehen, daß ich dir die falsche Eigenschaft genannt habe.
Korrekt wäre
ausblenden 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):
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
DataRow row = cmbkneipe.SelectedItem as DataRow;
if (row != null)
{
  // z.B.
  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.
ausblenden C#-Quelltext
1:
dt.DefaultView.RowFilter = "Kneipe = '" + id + "'";					


Hatte ich dir schon mal Links für DataBinding gegeben?
s. www.c-sharp-forum.de....php?p=640560#640560
bzw. Verweise auf
www.c-plusplus.de/forum/p2056421
und besonders
www.c-plusplus.de/forum/p2049983

So jetzt kommst du hoffentlich mit deinem Programm (und mit dem Erlernen von .NET) weiter...


Zuletzt bearbeitet von Th69 am Di 20.12.11 11:03, insgesamt 1-mal bearbeitet
moori64 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: 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.


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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).

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
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: 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.


ausblenden volle Höhe 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;
        }
    }
}