Laden...
R
raiguen myCSharp.de - Member
31020 Salzhemmendorf Dabei seit 10.04.2007 158 Beiträge
Benutzerbeschreibung

Forenbeiträge von raiguen Ingesamt 158 Beiträge

15.03.2014 - 12:30 Uhr

entweder ein leeres DataGridView

Entweder passt die WHERE-Klausel nicht oder die JOIN-Bedingung findet keine passenden Datensätze.

oder eine SQLException von wegen "Falsche Syntax in der Nähe von 'Tische'".

Der Fehler liegt wohl eindeutig hier:


SELECT * FROM Klasse JOIN Tische ON Klasse.Nummer = Tische.Nummer Tische 

Zur Verdeutlichung:
SELECT * FROM Klasse JOIN Tische ON Klasse.Nummer = Tische.Nummer Tische
Die Tische haben da nichts zu suchen...

Ansonsten schließe ich mich FZelle an.

14.03.2014 - 22:43 Uhr

Eine Methode für "...DropDownItems[x].SubItems.Add()" fehlt mir iwie. Die gibt es auch nicht, sondern 'nur' DropDownItems.Add().

Habe mal einen kurzen Schnippsel für exemplarische Vorgehensweise, an dem ersichtlich wird, wie Du Dein 'Problem' lösen könntest (natürlich Deinen Bedürfnissen/Erfordernissen anpassen!):


            //--DropdownItems zur Laufzeit zu einem bestehenden DropDownButton hinzufügen
            ToolStripMenuItem tsmiLevel0, tsmiLevel1 ;
            //--Rootebene
            tsmiLevel0 = new ToolStripMenuItem();
            tsmiLevel0.Text = "Level0 Eintrag 1";
            tsmiLevel0.Tag = "Level0Tag1";

            //--Unterebene
            tsmiLevel1 = new ToolStripMenuItem();
            tsmiLevel1.Text = "Level1 Eintrag 0.1";
            tsmiLevel1.Tag = "Level1 Tag0.1";
            //--in die Rootebene aufnehmen
            tsmiLevel0.DropDownItems.Add(tsmiLevel1);

            tsmiLevel1 = new ToolStripMenuItem();
            tsmiLevel1.Text = "Level1 Eintrag 0.2";
            tsmiLevel1.Tag = "Level1 Tag0.2";
            //--in die Rootebene aufnehmen
            tsmiLevel0.DropDownItems.Add(tsmiLevel1);

            //--alle DropDownItems zum DropDownButton hinzufügen
            toolStripDropDownButton2.DropDownItems.Add(tsmiLevel0);


            //-- neue Rootebene (=Level 0)
            tsmiLevel0 = new ToolStripMenuItem();
            tsmiLevel0.Text = "Level0 Eintrag 2";
            tsmiLevel0.Tag = "Level0Tag2";

            //--Unterebene (=Level 1)
            tsmiLevel1 = new ToolStripMenuItem();
            tsmiLevel1.Text = "Level1 Eintrag 2.1";
            tsmiLevel1.Tag = "Level1 Tag1.1";
            tsmiLevel0.DropDownItems.Add(tsmiLevel1);

            tsmiLevel1 = new ToolStripMenuItem();
            tsmiLevel1.Text = "Level1 Eintrag 2.2";
            tsmiLevel1.Tag = "Level1 Tag1.2";
            tsmiLevel0.DropDownItems.Add(tsmiLevel1);

            toolStripDropDownButton2.DropDownItems.Add(tsmiLevel0);


             //-- neuen DropDownButton zur Laufzeit mit allen erforderlichen Ebenen hinzufügen
            ToolStripDropDownButton tsddButton;

            tsddButton = new ToolStripDropDownButton("Neuer Buttton");
            //-- neue Rootebene (=Level 0)
            tsmiLevel0 = new ToolStripMenuItem();
            tsmiLevel0.Text = "Level0 Eintrag 1";
            tsmiLevel0.Tag = "Level0Tag2";

            //--Unterebene (=Level 1)
            tsmiLevel1 = new ToolStripMenuItem();
            tsmiLevel1.Text = "Level1 Eintrag 1.1";
            tsmiLevel1.Tag = "Level1 Tag1.1";
            tsmiLevel0.DropDownItems.Add(tsmiLevel1);

            tsmiLevel1 = new ToolStripMenuItem();
            tsmiLevel1.Text = "Level1 Eintrag 1.2";
            tsmiLevel1.Tag = "Level1 Tag1.2";
            tsmiLevel0.DropDownItems.Add(tsmiLevel1);

            tsddButton.DropDownItems.Add(tsmiLevel0);
            toolStrip1.Items.Add(tsddButton);



Zu jedem neuerstellten ToolStripMenuItem tsmiLevel1 kann beispielsweise auch gleich das passende Ereignis abonniert werden:


            tsmiLevel1.DropDownItemClicked += new ToolStripItemClickedEventHandler(tsmiLevel1_DropDownItemClicked);

...
            tsmiLevel1.Tag = "Level1 Tag1.1";
            tsmiLevel1.DropDownItemClicked += new ToolStripItemClickedEventHandler(tsmiLevel1_DropDownItemClicked);
            tsmiLevel0.DropDownItems.Add(tsmiLevel1);

...
            tsmiLevel1.Tag = "Level1 Tag1.2";
            tsmiLevel1.DropDownItemClicked += new ToolStripItemClickedEventHandler(tsmiLevel1_DropDownItemClicked);
            tsmiLevel0.DropDownItems.Add(tsmiLevel1);



       void tsmiLevel1_DropDownItemClicked( object sender, ToolStripItemClickedEventArgs e )
        {   //--nur als exemplarisches Beispiel
            string itemtag =  e.ClickedItem.Tag.ToString();
            //--mach was auch immer, z.B. Detaildaten anhand des geklickten Items bzw des Tags holen...
        }


14.03.2014 - 20:34 Uhr

Die BindingSource bzw die gebundene DataSource scheint die Aktualisierung nicht mitbekommen zu haben...
Versuch's mal mit

bs.ResetBindings(true);

Näheres BindingSource Methoden

21.06.2013 - 22:55 Uhr

Das hier dürfte für Dich interessant sein und Deinen Wünschen/Bedürfnissen entsprechen:

Easily turn a ListView into a nicely printed report, complete with print preview

Der ListViewPrinter druckt ALLE Spalten/Zeilen eines ListView - selbst Gruppierungen und forlaufende Seiten sind schnell in der Druck-Vorschau angezeigt.

Setze diese DLL oft ein und das Ergbenis ist auch für meine Kunden zufriedenstellend.

Der beigefügte Screeshot zeigt die Preview aus einem meiner Programme.

19.04.2013 - 10:26 Uhr

Wie wäre es mit AutoComplete? Weitere Infos auch bei MSDN ComboBox.AutoCompleteMode-Eigenschaft

Wie bei dem Beispiel AutoComplete ComboBox in Visual C# 2010 gezeigt, werden die Benutzereingaben schon passend vorgefiltert.

18.04.2013 - 21:17 Uhr

Hallo Theo,
alles was du tun müsstest, wäre die Benutzereingaben zu behandeln. Klickt der Nutzer mit der Maus auf einen Tab oder wählt diesen mit der Tastatur aus, setzt du ein Flag in deiner Form.

Hallo inflames2k: warum alles so verkomplizieren, wenn man es auch einfacher machen kann?

Es ist aber alles andere als empfehlenswert, weil man von so einem Control gewohnt ist und auch erwartet, dass man beliebig drin hin und her schalten kann. Genau das sollte man vermeiden: den User zu verärgern dahingehend, dass er sich ärgert/wundert, warum (hier z.b.) ein Tabwechsel nicht möglich ist.
Wenn - wie in Theos Szenario - nur zwei Panels (nicht anderes sind TabPages) abwechselnd sichtbar sein sollen, dann kann ich entweder die Tabreiter verstecken (und dennoch sind die TabPages codemässig wechselbar) oder eben ein SplitPanel-Container benutzen, wo die entsprechenden Panels dann sichtbar gemacht werden. Nicht mehr und nicht weniger.

18.04.2013 - 19:46 Uhr

Denkbar ist

tabControl1.TabPages.Remove(tabPage1); //Ausblenden

tabControl1.TabPages.Add(tabPage1); //Einblenden

sprich: die nicht gewünschten Tabs aus der TabPageCollection des betr. TabPageControls entfernen (bedingt natürlich, dass die Collection=die TabPages bereits zur Designzeit vorhanden ist).

Das nicht sichtbar machen in Abhängigkeit des Benutzers (entweder über eine Art Login oder über den Computernamen/Netzwerknamen) ist allemal besser als die entspr. Tab nur zu disablen -> würde nur unnötige Fragen des Benutzers produzieren 😉

18.04.2013 - 19:15 Uhr

Entweder die Tabreiter zur Laufzeit verstecken:

         //diese Einstellungen verstecken die Reiter erst zur Laufzeit
         //zur Design-Zeit sind die Reiter ja sehr nützlich
         tabControl1.SizeMode = TabSizeMode.Fixed;
         tabControl1.ItemSize = new Size(0, 1);
         tabControl1.Appearance = TabAppearance.Buttons;


siehe auch TabControl als Basis für Assistenten und sowas

oder einen SplitContainer-Control anstelle des TabPageControl verwenden

13.02.2013 - 18:10 Uhr

Das DataGRidView ist standardmässig im Editiermodus wie es scheint...

Setze filterDataGridView.AllowUserToAddRows = false;, dann ist das DataGRidView nicht mehr autom. im Editiermodus, wenn auf bzw in eine Zelle geklickt wird. Du kannst dann nur noch über den +-Buttom einen neuen Datensatz anfügen bzw den dann auch gleich wieder löschen, ohne dass in eine Zelle was eingetragen wird.

13.10.2011 - 11:15 Uhr

Das 'Normale' ListView kennt nur eine Stufe der Gruppierung, Untergruppierungen sind nicht möglich.

Letztlich ist die Frage, nach welchen Kriterien die Gruppen generiert werden...

Vllt ist das hier eine Möglichkeit: VirtualTreeListView

10.10.2011 - 22:10 Uhr

Dann musst Du auf die Ereignisse 'Collapsed' bzw 'Expanded' des Expanderkontrol entsprechend reagieren bzw dort die Fenstergrösse anpassen...

10.10.2011 - 22:02 Uhr

Tipp zum Selbermachen (als Anregung) RepeatButton

09.10.2011 - 14:30 Uhr

mehrere Möglichkeiten, um zum gewünschten Ergebnis zu kommen:

a.) DGV ist an eine Datenquelle gebunden:


			if (personDataGridView.SelectedRows != null && personDataGridView.SelectedCells.Count > 1)
			{

				foreach (DataGridViewRow dgvr in personDataGridView.SelectedRows)
				{
					DataRowView drv = (DataRowView)dgvr.DataBoundItem;
					if (drv != null)
					{
						object[] dgvrItems = drv.Row.ItemArray;
						//--evtl. Änderungen vor Übernahme in neue Tabelle
						dgvrItems[0] = Convert.ToInt16(dgvrItems[0]) * 100;
						dgvrItems[1] = (string)"irgendwas";
						//--Erstellen einer neuen Tabellenzeile und Einfügen derselben
						dtKopie.Rows.Add(dgvrItems);
					}
				}

			}


b.) DGV hat keine Datenquelle:


			if (personDataGridView.SelectedRows != null && personDataGridView.SelectedCells.Count > 1)
			{

				foreach (DataGridViewRow dgvr in personDataGridView.SelectedRows)
				{
					if (dgvr != null)
					{
						DataGridViewCellCollection dgvrItems = dgvr.Cells;
						//--Erstellen einer neuen Tabellenzeile und 
						//--Werten der Zellen füttern

						DataRow newrow = dtKopie.NewRow();
						for (int i = 0; i < dgvrItems.Count; i++)
						{
							newrow[i] = dgvrItems[i].Value;
						}
						//--evtl. Änderungen vor Übernahme in neue Tabelle
						newrow[0] = Convert.ToInt16(dgvrItems[0].Value) * 100;
						newrow[1] = (string)"irgendwas";

						//--neue und geänderte Zeile der Tabelle hinzufügen
						dtKopie.Rows.Add(newrow);
					}

				}

			}


:rtfm:DataBound :rtfm: DataRowView

Code entsprechend Deinen Bedürfnissen anpassen (Tabellenbezeichnung etc);
Codeschnippsel aus einem meiner Projekte und dient nur zur Veranschaulichung 😉

            dTable.Rows.Add(newRows_.DataBoundItem as DataRow); // Exception: DataBoundItem = NULL !!?? Dürfte klar sein -&gt; eine neue Tebellenzeile ist an nix gebunden 😉  

Rainer

[EDIT] Code wg. Fehler korrigiert [/EDIT]

01.09.2011 - 18:45 Uhr

...Text im Textfeld der ComboBox eingebe, dann die Dropdownliste öffne und einen Eintrag selektiere,...

dann ist das Standardverhalten der Combobox doch so, dass das selektierte Item in der Dropdownliste oben in der Textbox erscheint/angezeigt wird.
Wenn nun das selektierte Item gelöscht wird, dann ist im Endeffekt kein Item mehr selektiert und somit kann dann auch nix mehr in der Textbox angezeigt werden.

Arrrghhhh... ich merke grad beim Testen, dass das blosse überfahren mit der Maus über einen Eintrag in der Dropdownliste schon den SelectedIndex setzt, also nicht erst beim explizieten Klick auf ein Item... 8o Das hätte ich jetzt nicht erwartet und JETZT verstehe ich auch das Beispielbild vom TS...

Aber.. ich glaube ich habe die Lösung des Problems gefunden:

		private void comboBox1_KeyDown(object sender, KeyEventArgs e)
		{
			if (e.KeyCode == Keys.Delete && comboBox1.DroppedDown && comboBox1.Items.Count > 1 && comboBox1.SelectedIndex > -1)
			{//--Text merken der in der CB-Textbox steht
			 string cbtext = comboBox1.Text;
				e.Handled = true;
				comboBox1.Items.RemoveAt(comboBox1.SelectedIndex);
				//--gemerkten Text wieder einsetzen
				comboBox1.Text = cbtext;
			}

		}

Im Übrigen sollte man auch den Wert von SelectedIndex abfragen, da sonst bei -1 eine Exception geworfen wird.

MfG Rainer

16.08.2011 - 17:56 Uhr

Hier zeigt sich, dass die Verwendung einer BindingSource das Ganze etwas 'geschmeidiger' macht:


public Form1() {
   InitializeComponent();

   BindingSource meineBindingSource = new BindingSource();
   meineBindingSource.DataSource = meinDataTable; // oder auch DataSet.Table[xyz];
   meineBindingSource.CurrentChanged += new EventHandler(meineBindingSource_CurrentChanged);
   meinDataGridView.DataSource = meineBindingSource;

...
}

	  void meineBindingSource_CurrentChanged(object sender, EventArgs e)
	  {
		  DataRow row = ((DataRowView)meineBindingSource.Current).Row;
		  if (row != null)
		  textBox2.Text = row[4].ToString();
	  }


Sinnvoll wäre aber auch, die Textbox(en) direkt an die zugrunde liegende Datenquelle zu binden - besonders dann, wenn man in den Textboxen noch Änderungen vornehmen will... und die Änderungen sicherlich auch in die Tabelle übernehmen möchte 😉


  textBox3.DataBindings.Add("Text",meineBindingSource, NameDerSpalte);


08.08.2011 - 19:58 Uhr

Daher meine Frage: Kann ich Forms komplett in ein anderes Form einbetten? So, dass ich auf meiner eigentlichen "HauptGUI" einen Container habe und da per Knopfdruck ein anderes Form vollständig reinladen kann.

JA, das geht 😃
Jede WindowsForm hart eine Eigenschaft, die sich TopLevel nennt. Setzt man diese auf false, so kann ich die Form x-beliebig in einen anderen Container palzieren; Beispiel:

		private void button1_Click(object sender, EventArgs e)
		{
			Form1 frm1 = new Form1();
			frm1.FormBorderStyle= System.Windows.Forms.FormBorderStyle.None;
			frm1.TopLevel=false;
			frm1.Parent=groupBox1;
			frm1.Dock = DockStyle.Fill;
			frm1.Location = new Point(3,20);
			frm1.Visible=true;
			frm1.BringToFront();
		}

Als 'Übungsbeispiel' habe ich mal fix ne Solution erstellt 😉 Ist nur als reine Demo, ,um die Vorgehensweise zu zeigen.

Ich habe in vielen meiner Projekte das so gemacht, da ich nicht ständig die - in meinen Augen - unflexiblen UserControls haben wollte.

Gruß Rainer

27.05.2011 - 21:11 Uhr

Probier's doch mal so:


private void  dataGridViewVeranstaltungen_CellMouseMove(object sender, DataGridViewCellMouseEventArgs e)
{
		if (e.RowIndex < 0)
			return;

        DataGridViewRow Zeile = dataGridViewVeranstaltungen.Rows[e.RowIndex];

        if (Zeile.Cells[11].Value != null)
        {
           Veranstaltung_alleinfos Event = (Veranstaltung_alleinfos)Zeile.Cells[11].Value;
           Zeile.Cells[1].ToolTipText = Event.asTextList;
           Zeile.Cells[2].ToolTipText = Event.Veranstalter.showTextAsList;
                 
		if (e.ColumnIndex>2)
        {
            Zeile.Cells[e.ColumnIndex].ToolTipText = Event.asTextList;
        }
    }
}





27.05.2011 - 17:28 Uhr

Nachtrag:

Mithilfe der DataGridViewCheckBoxColumn kann auch der Wert einer Tabellenspalte vom TypVarChar bzw String als true bzw false angezeigt werden.
Bspw. wenn in einer Mitgliedertabelle die Spalte 'Status' als String deklariert ist und die Werte 'aktiv' bzw 'inaktiv' enthält, sind die Value-Werte der Checkbox dann so zu notieren:

            cbcol.TrueValue = "aktiv";    //true
            cbcol.FalseValue = "inaktiv";    //false
            cbcol.DefaultCellStyle.DataSourceNullValue = "inaktiv";    //wenn Wert in Spalte = NULL ist

Oder wenn in o.a. Tabelle die Spalte 'Aktiv' benamt ist und nur die Einträge 'J' bzw 'N' zulässt, dann wird das halt so notiert:

            cbcol.TrueValue = "J";    //true
            cbcol.FalseValue = "N";    //false
            cbcol.DefaultCellStyle.DataSourceNullValue = "N";    //wenn Wert in Spalte = NULL ist

Also muss für zur Darstellung eines BOOLEAN-Zustandes nicht zwangsläufig auch das Tabellenfeld BOOLEAN sein 😉

27.05.2011 - 16:35 Uhr

Ich habe eine MySQL-DB in der sich in einer Tabelle eine Spalte befindet, die nur den Wert 0/1 annehmen kann....
...hab zwar bei der erstellung boolean angegeben, aber nun steht tinyint(1) als datentyp drin ...

Ist auch richtig so, da MySql den Typ BOOLEAN als TinyInt 'versteht'.

...Nachtrag: Die Tabelle wird somit dynamisch erzeugt und auch die Spalten sind nicht im DGV vorher angelegt, also gibts da keine Möglichkeit gleich als DGVCheckbox zu definieren, zumindest mir nicht bekannt, daher frag ich auch.

Du kannst / solltest in diesem Fall auch die Spalten des DGV dann dynamisch erstellen. Ist zwar etwas Code tippen, aber erfüllt dann Deine Zweck 😉


		void GridVorbereiten(DataGridView dgv)
		{	//--WICHTIG!! Wenn nicht gesetzt, werden beim Binden an eine DataSource
			//--alle Spalten der DataSource(DataTable) zusätzlich generiert!!
			dgv.AutoGenerateColumns = false;

			DataGridViewCheckBoxColumn cbcol = new DataGridViewCheckBoxColumn();
			cbcol.Width = 20;
			cbcol.HeaderText = "...";
			cbcol.DataPropertyName = "MySql-TinyInt-Spalte";
			//--Spalte in der Tabelle ist vom Typ Int (bei MySql=TinyInt für BOOLEAN)
			//--wenn man ganz sicher gehen will, dann kann man das hier noch zusätzlich angeben:
			cbcol.TrueValue = 1;	//true
			cbcol.FalseValue = 0;	//false
			cbcol.DefaultCellStyle.DataSourceNullValue = 0;	//wenn Wert in Spalte = NULL ist
			dgv.Columns.Add(cbcol);

			DataGridViewTextBoxColumn txtcol;
			txtcol = new DataGridViewTextBoxColumn();
			txtcol.HeaderText = "...";
			txtcol.DataPropertyName = "...";
			txtcol.Width = 200;
			dgv.Columns.Add(txtcol);

			//--an die Datenquelle binden
			dgv.DataSource = DataTable_aus_MySQLAbfrage;
		}



Das DGV ist durchaus in der Lage, in einer DataGridViewCheckBoxColumn Int-Werte zu interpretieren: 0 ist false, 1 ist true 😉

Du mußt nach dem Einlesen die int-Werte nach bool konvertieren, und vor dem wegschreiben annersrum.
Wurde schon gesagt: DGVCheckboxColumn ist dafür da, bools anzuzeigen, keine ints

NÖÖ: Muss man nicht! Siehe meine Ausführung oben 😉 Für Die DGVCheckBoxColumn ist 0=false und 1=true

Und für das Wegschreiben in die MySql-Tabelle ist es für die TinyInt-Spalte auch unerheblich, welcher Wert übergeben wird

 SET TinyIntSpalte=0 
 SET TinyIntSpalte=false
 SET TinyIntSpalte=FALSE

Alle Schreibweisen sind richtig.

Übrigens: selbst ohne die expliziete Zuweisung

			cbcol.TrueValue = 1;	//true
			cbcol.FalseValue = 0;	//false

wird der 'Zustand' der DGVCheckboxColumn richtig angezeigt 😉

Beim Binden gibt es dann keine Problem mehr. Gibt es bei meiner o.a. Bindung auch nicht.

Aber ich denke auch im DataTable muss der Datentyp auf bool festlegbar sein und somit sollt sich das Problem auch lösen können.

Die DataTable bzw das Schema derselben wird aus der MySql-Abfrage generiert und da ist der Spaltentyp NICHT Boolean sondern TinyInt bzw Int - somit kann hier dann nix festgelegt werden.

Gruß Rainer

24.05.2011 - 22:13 Uhr

Ob ein DGV mit DBNull.Value werten umgehen kann, habe ich nicht ausprobiert. Und warum nicht? Denn dann wüsstest du, dass das DGV sehr geschmeidig mit NullValues umgehen kann.

Allerdings sehe ich JETZT erst, was Du machst: Jede Spalte der DataRow wird als neue ZEILE im DGV hinzugefügt, also eine senkrechte Abbildung einer waagerechten Zeile... DANN ist es verständlich, dass keine NULL-Zeilen vorhanden sein düerfen 😉

Vereinfacht kannst du aber auch das hier machen, ohne den 'Umweg' üver ein extra ItemArray (weil die Spalten einer DataRow direkt über den Index angesprochen werden können):

            for (int i = 0; i < dRtest.ItemArray.Length; i++) 
            {
                if (dRtest[i] != DBNull.Value) {
                    dgvRowNames.Rows.Add(dRtest[i].ToString());
                }
            }


24.05.2011 - 20:53 Uhr

Die Zeilennummer des DGV (=RowId) IST nicht immer auch die gleiche Zeilennummer der zugrunde liegenden DataTable. Das DGV ist ja wie der Name bereits sagt, nur eine bestimmte Ansicht der Daten.

Um auf den richtigen datensatz der zugrunde liegenden DataTable (oder DataSource) zu kommen, um bspw. denWert einer nicht im DGV sichtbare Spalte ( z.B. ID der Adresse) zu erhalten, hilft das hier:


		private void mein DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
		{
			DataRowView dr = meinDataGridView.CurrentRow.DataBoundItem as DataRowView;
			gesuchteID = Convert.ToInt16(dr["ID"]);
		}


Mir scheint, dass nachdem filtern immer noch die ursprüngliche datatable da ist, wie bekomme ich das hin, das mit dem filtern auch die datatable refresht wird???

Natürlich ist die ursprüngliche DataTable noch vorhanden, warum sollte die sich auch ändern? Und das Filtern refresht eigentlich nicht die DataTable als solches, sondern intern wird (vereinfacht gesagt) anhand der Filterbedingung eine DataRowCollection erstellt und diese dann dem DGV zur Ansicht weitergereicht.

Klicke ich eine Zeile ohne Filter (sagen wir die 7. - Herr Mueller) öffne ich ein weiteres Fenster und ich lese weitere Daten aus einer anderen Tabelle einer db aus. Bist Du sicher, dass es auch die RICHTIGEN Daten dieses Herrn Müller sind? Beim ersten Erstellen des DGV kann es zufälligerweise so sein, wenn nicht schon vorher programmtechnisch eine Sortierung für die Ansicht vorgenommen wurde.

werden aber die Daten des Eintrags angezeigt, die zuvor an erster Stelle meines datagrid standen. Dann holst du die Daten der anderen Tabelle anscheinend anhand der DGV-RowId (hier gleich 0). DAS kann dann ja auch nicht funktionieren 😉

13.04.2011 - 13:02 Uhr

Folgende Vorgehensweise habe ich in einem meiner zahlreichen Projekte realisiert und es funktioniert tadellos.



/* dgvAdressen -> DataGridView
  datentabelle -> DataTable
\*/

//-- einmaliges Erstellen/konfigurieren des DGV
        internal void gridViewSpaltenErstellen()
        {	//-- ggf. mittels Designer eingestellte Properties:
            dgvAdressen.BorderStyle = BorderStyle.None;
            dgvAdressen.AutoGenerateColumns = false;	//WICHTIG!! SONST hauts dir ALLE Spalten aus der Tabelle auf den Schirm!
            dgvAdressen.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            //dgvAdressen.ReadOnly = true;
            dgvAdressen.RowHeadersVisible = false; // linkste Spalte mit dem Dreieck
            dgvAdressen.RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.None;

            DataGridViewCheckBoxColumn colcb = new DataGridViewCheckBoxColumn();
            colcb.HeaderText = "";
            colcb.Width = 30;
            colcb.SortMode = DataGridViewColumnSortMode.NotSortable;
            dgvAdressen.Columns.Add(colcb);

            DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();

            col = new DataGridViewTextBoxColumn();
            col.HeaderText = "Firma";
            col.DataPropertyName = "K_Firma";
            col.Width = 300;
            col.ReadOnly = true;
            col.SortMode = DataGridViewColumnSortMode.NotSortable;
            dgvAdressen.Columns.Add(col);

            col = new DataGridViewTextBoxColumn();
            col.HeaderText = "Name";
            col.DataPropertyName = "K_Vorname";//-- K_Nachname wird für Newsletteranrede benutzt
            col.Width = 150;
            col.ReadOnly = true;
            col.SortMode = DataGridViewColumnSortMode.NotSortable;
            dgvAdressen.Columns.Add(col);

            col = new DataGridViewTextBoxColumn();
            col.HeaderText = "EmailAdresse";
            col.DataPropertyName = "EMail";
            col.Width = 320;
            col.ReadOnly = true;
            col.SortMode = DataGridViewColumnSortMode.NotSortable;
            dgvAdressen.Columns.Add(col);

        }

//-- Daten holen 

        void datenHolenUndTabelleFuellen()
        {//--Datenbank abfragen
            datentabelle = KontaktData.KontaktEmailAdressen();
            //--DataGridView an Tabelle binden
            dgvAdressen.DataSource = datentabelle;

			//--alle checkboxen erstmal auf Checked setzen
            for (int i = 0; i < dgvAdressen.RowCount; i++)
            {
                dgvAdressen.Rows[i].Cells[0].Value = true;
            }

        }


In diesem Beispiel kann der Benutzer auswählen, ob jmd. einen Newsletter erhalten soll oder nicht (je nachdem, ob in der ersten Spalte ( DataGridViewCheckBoxColumn) das Häkchen gesetzt ist).
Es kann also in einem DGV durchaus auch eine** ungebundene** Spalte enthalten sein 😉

13.04.2011 - 11:48 Uhr

Moin 😃

ICh weiss genau was du willst 😃 und für diesen Zweck packst du alle Panels in einen Container -> FlowLayoutPanel.#
Einstellung/Eigenschaft FlowDirection auf TopDown.

02.02.2011 - 18:35 Uhr

NAchdem ich auch zweimal mit dem VS-generierten Dataset etc. auf die Programmierfresse geflogen bin, erstelle ich mir alles Datenbankspezifische grundsätzlich nur noch manuel. Erstens habe ich das Gewurstel der ganzen Designer nicht, zweitens weiss ich selber am besten was ich wo mache und drittens habe ich da einen besseren Überblick.

Ich weiss nicht (mehr) wie ich damals die Fehler (so wie du sie beschrieben hast) bzw die Änderung(en) wieder allgemein bekannt gemacht habe...

Sorry, wird dir zwar nixcht weiterhelfen, aber ich pers. lasse von den ganzen VS-Automatismen und Designer-Assistenten die Finger.

21.01.2011 - 12:20 Uhr

Ist normalerweise nicht meine Art, aber hier muss ich doch wohl was zu sagen:

Sorry, aber ich muss lachen.
Ich habe für euch sg. Experten paar Sachen umgebaut und ihr konntet das Problem nicht lösen geschweige ihr habt es verstanden, worum es geht....

WIR sog.Experten haben es sehr wohl verstanden, was DEIN Problem ist und DIR auch entsprechende Lösungsvorschläge gemacht.

Statt dessen werde ich immer aufgefordert dies und jenes zu machen ... Du wurdest mehrfach 'aufgefordert', den SQL-Befehl zu parametrisieren, damit DEIN Problem elegant gelöst werden kann. Aber du hast es nicht verstanden, sondern frickelst immer noch mit zusammengestöpselten Commandstrings herum. DANN kannst DU dein Problem auch nicht lösen!!
Ich vergeude hier nur meine Zeit und ihr tut es auch,...

Deine Zeit vergeudest du selber, in dem du mit unzureichenden 'Löungen' hedrum experemntierst, anstatt die gut gemeinten Hinweise umzusetzen und auszutesten!!
Wir haben unsere Zeit in der Tat dahingehend vergeudet, Dir immer wieder zu sagen, wie Du es RICHTIG zu machen hast ==>> Parameter verwenden...

statt noch vieles über Programmieren zu lernen....

Ich glaube, DU MUSST noch viel über Programmieren lernen - uind vor allem: Dokumentationen lesen, lesen, lesen....

Nehmt es nicht persönlich, aber im großen und ganzen seid ihr nicht weiter als ein durchschnittlicher Inoformatikstudent im 2.Semester.
Vorsicht mein Guter!! Das kann man schon persönlich nehmen! Lehne dich nicht zu weit aus dem Fenster - vor allem dann nicht, wenn man nicht ansatzweise die funktionierenden Hinweise von gestandenen Programmierern annimmt und austestet!

So, das musste ich mal loswerden sorry

20.01.2011 - 18:07 Uhr

🤔 Verstehe die Fragestellung nicht ganz...

Würde eher vermuten, dass diese Bedingung

if (((IList<string>)my_sections).Contains(sectionToFind))  

nicht ganz funktioniert; weil: du prüfst einen ungetrimmten Eintrag mit einem** getrimmten** Vergleichswert 😉

21.12.2010 - 21:38 Uhr

...Doch dies wirft mir eine cast Exception in der letzten Zeile....

So sollte es richtig gecastet werden:


UID = Convert.ToInt16(cb.SelectedValue);

08.02.2010 - 14:37 Uhr

            string Pfad = string.Empty;

                foreach (string pfad in openFileDialog1.FileNames)
                {
                    _items.Add(Pfad);
                }

        

Die o.a. Zeilen sind dann ja wohl mehr als flüssig = überflüssige, ne?

08.02.2010 - 14:26 Uhr

@hias116.

Ein kurzer Blick in die FAQ, Stichwort Programmierung deines Hosters sagt:
(... innerhalb von 1 Minute gefunden 😜 )

Kann die DB von außen erreicht werden?

Nein, die MySQL ist nur vom jeweiligen Rechner ("localhost") erreichbar, Änderungen diesbezüglich klären Sie direkt mit dem Support.

Damit dürfte es wohl klar sein, dass es so ohne weiteres also nicht geht.

Warum werden die FAQ's zum Hoster etc nicht gleich und sorgfältig gelesen ?( 8o

Gruss
Rainer

08.02.2010 - 14:01 Uhr

Und wie wäre es mithilfe des DataGridView?
Mag zwar overheded sein, aber das bietet sich doch an!?

Die erste Spalte mit TextAlign = rechtsbündig, die 2. Spalte default auf Linksbündig.

Zusätzliche Einstellungen für das DGV:
BackGroundColor = Hintergrundfarbe des ParentControls
BorderStyle=None
CellBorderStyle=None
CellHeadersVisible=Flaer
ReadOnly=True
MultiSelect=False
RowHeadersVisible=False
ScrollBars=None

Befüllen des DGV codemässig zb:


		  //--StringArray-Liste mit den Werten erstellen
		  List<string [ ]> dgvList = new List<string [ ]> ( );
		  dgvList.Add ( new string [ ] { "Zeile 1:", "Wert1" } );
		  dgvList.Add ( new string [ ] { "Zeile Nr.2:", "Wert2" } );
		  dgvList.Add ( new string [ ] { "irgendetwas:", "x-beliebiger Wert" } );

		  //--ListArray als DatenZEile ins DGV einfügen
		  for ( int i = 0; i < dgvList.Count; i++ )
			  {
			  dataGridView1.Rows.Add ( dgvList [ i ] );
			  }

		  //--oder direkt die DataRows mit den entsprechenden 'Labels' erzeugen
		  dataGridView1.Rows.Add ( new string [ ] { "Zeile 1:", "Wert1" } );
		  dataGridView1.Rows.Add ( new string [ ] { "Zeile Nr.2:", "Wert2" } );
		  dataGridView1.Rows.Add ( new string [ ] { "irgendetwas:", "x-beliebiger Wert" } );

		  //--die defaultmaässige Selection der ersten ZElle deaktivieren
		  dataGridView1.ClearSelection ( );
		  dataGridView1.Enabled = false;


Beispielbild siehe unten. BorderStyle und BackgroundColor zur Demo hier noch nicht gesetzt.

04.11.2009 - 14:55 Uhr

@LarsThorswald

zur 1. Frage -> die Columns sind in der IDE designed
zur 2. Frage -> zur Zeit verwendetes Betriebssystem XP SP3

Es ist tatsächlich zu vermuten, dass der von dir beschriebene Effekt unter W7 auftritt 🤔

Langsam hasse ich es, mich mit ständigen 'Neuerungen' im Windows rumzuärgern - es macht keinen Spass mehr X(

04.11.2009 - 11:35 Uhr

Also: ich kann das Prob von LarsThorwald nicht nachstellen 8o
Bei mir funktioniert das einwandfrei 👍

21.10.2009 - 17:06 Uhr

X_UserControl c = new X_UserControl();
X_splitContainer.Panel2.Controls.Add(X_UserControl); 8o
Die zweite Zeile wird m.E. auch nicht zum Erfolg führen, weil du versuchst, die Klasse X_UserControl und nicht die Instanz c dieses UserControls auf das Panel zu packen.
Richtigerweise müsste es so sein:

X_splitContainer.Panel2.Controls.Add(c);

Rainer

15.10.2009 - 13:31 Uhr

Nun, mit dem 'normalen' ListView wird das wohl kaum machbar sein; aber vielleicht hiermit? -> Object ListView

01.10.2009 - 20:49 Uhr

@BerndFm: zustimm in allen Punkten!

@raiman: mir ist nicht ganz klar, wie die Unterknoten einen Hinweis auf den Elternknoten bekommen; das kann ich aus deiner Tabellenansicht nicht eindeutig erkennen. Wenn du uns das Geheimnis verrätst, dann können wir dir auch entsprechende Tipps geben.

Gruss
Rainer

24.09.2009 - 23:24 Uhr

Moin smile

Vielleicht hilft das CurrentCellDirtyStateChanged-Ereignis des DGV in Zusammenarbeit mit dem CellValueChanged-Ereignis -> guggst du SDK-/MSDN-Doku:Das Beispiel ist zwar auf die CheckboxColumn ausgelegt, lässt sich aber entsprechend anpassen.
Gruss Rainer

24.09.2009 - 22:54 Uhr

...
Besser so :

row["kontakt"] = kontakt;  

...

Ist auf jeden Fall aussagekräftig anhand des Spaltennamens. Es geht aber auch - sofern der Index der Spalte bekannt ist - das hier:

row[0] = kontakt;

Das nur mal der Vollständigkeithalber 😉

Rainer

07.09.2009 - 12:01 Uhr

Was mach ich denn falsch ?

Die Breite des Usercontrols bereits beim Erstellen des selbigen an den 'Parent' anzupassen; und das haut nicht hin, weil das UC ja noch nicht weiss, wo es denn plaziert wird...

Entgegen der Meinung vo herbivore denke ich schon, dass das FlowLayoutPanel eine gute Idee ist, UserControls zu hosten. Selbst Forms können (anstelle von USerControls) eingefügt werden.
Ich hab mal auf die Schnelle zum Testen ein UserControl (hier ein ActionPanel) ud eine Form (hier Form1) in ein FloxLayoutPanel eingefügt:

	  private void AddControls2FlowLayoutPanel
		  {
		  UserControl a = new ActionPanel ( );
		  //--Breite anpassen abzüglich Breite des Scrollbalkens
		  a.Width = flowLayoutPanel1.Width -24;
		  //--UC zum flowLayoutPanel hinzufügen
		  flowLayoutPanel1.Controls.Add ( a );

		  Form1 frm = new Form1 ( );
		  //--Form als 'normales' Control degradieren
		  frm.TopLevel = false;
		  //--Höhe hier nur beispielhaft
		  frm.Height = 80;
		  //--Breite anpassen abzüglich Breite des Scrollbalkens
		  frm.Width = flowLayoutPanel1.Width -24;
		  //--BorderStyle setzen -> Titelleiste ausblenden
		  //frm.FormBorderStyle = FormBorderStyle.None;
		  //--Form sichtbar machen
		  frm.Visible = true;
		  //--zum flowLayoutPanel hinzufügen
		  flowLayoutPanel1.Controls.Add ( frm );
		  }

Eigenschaften des flowLayoutPanel1:

AutoSize = false;
AutoScroll=true;
FlowDirection=TopDown;
WrapContents=false;

Habe zum Test insgesamt 20mal diese beiden Controls hinzugefügt, die Performance ist noch recht ordentlich.
Der Screenshot zeigt, wie schön das Ganze funktioniert; die 'merkwürdige' Darstellung des beiden Controls sollte nicht irritieren: durch die Grösse des FlowLayoutPanel bedingt werden die Controls in der Breite zusammengestaucht.

Gruss Rainer

02.09.2009 - 20:58 Uhr

Hallo,

ich greif noch mal die Eingangssituation auf:

In meiner Applikation habe ich ein BindingSource an eine DataTable gebunden und diese wiederum mit einem DataGridView verbunden.
Nun hat der Anwender die Möglichkeit über ein Maske sich einen Filter zusammen zu stellen, um eine Liste für seine Arbeitsgrundlage zusammen zu stellen.

Das heisst für mich ganz klar folgender Weg:
Anhand der Filterkriteterien ein entsprechendes SQL-SELECT-Statement dynamisch erstellen und gegen die DB absetzen. Die Tabelle mit den gefilterten Datensätzen an die gleiche BindingSource anhängen wie die urprüngliche (alle Datensätze enthaltende Tabelle). Somit hat das angehängte DGV eben NUR diese Datensätze, die dann nach Belieben bearbeitet werden können und dann auch als Update in die DB geschrieben werden können.
Vorteil: a) nur eine 'gültige' DataTable, b) keine redundanten Daten (in verschiedenen DataTables), c) Bearbeitung der Daten erfolgt einheitlich (weil ja nur eine BindingSource vorhanden ist), d) keine Auswirkung auf die gefilterten Datensätze, wenn sich ein Filter-Feldwert ändert - solange die Änderungen noch nicht in die DB geupdatet wurden

Wenn der Anwender mit seinen Änderungen zufrieden ist und diese abspeichert, kann er entweder den Filter nochmals aufrufen oder aber er setzt den Filter ausser Kraft -> alle Datensätze anzeigen.

WIe bereits in meinem ersten Posting erwähnt, mache ich es grundsätzlich so; in der Regel sucht / filtert der Anwender seine Daten nach entsprechenden Kriterien und nur diese Datensätze werden ihm angezeigt und können bearbeitet werden.
Und dabei bedine ich mich nur EINER BindingSource, an der das DGV (oder eine andere äquivalente ANzeigekomponente) hängt.

Soweit mal meine Gedanken und Anregungen.

Gruss
Rainer

01.09.2009 - 23:20 Uhr

Idee: mit den Filterkriterien ein entsprechend passendes SQL-Statement generieren und dieses gegen die DB abschicken -> damit eine neue Tabelle 'erzeugen' und diese mit einer BindingSource an das DGV anbinden.
Solange die Änderungen in dieser gefilterten Tabelle nicht in die DB geupdatet werden, hat der Anwender Zugriff auf seine geänderten Daten, ohne das ein Filter zuschlägt.
Erst nach dem Update in die DB und erneuten Reload der Daten (mit gleichem Filterkriterien) sind diese dann natürlich nicht mehr 'greifbar'.

Generell: ich mache es grundsätzlich in der oben beschriebenen Art; ich lasse den Anwender seine Filterkriterien selbst zusammenstellen anhand von COmboboxen etc und setze dann ein entsprechend flexibel erstelltes SQL-SELECT an die DB ab. GErade bei sehr grossen Datenmengen macht sich das bemerkbar. Tausende von Datensätzen auf eine Rutsch in eine DGV zu laden, damit de Anwender dann schön scrollen kann, muss nicht sein (jaja, es gibt Anwender, die wollen das so..).
MEine Erfahrungen: mit Filtern=Suchen ist der Anwender besser bedient und die Daten sind schneller greifbar.

Gruss Rainer

27.08.2009 - 16:49 Uhr

@t2t: Richtig! Das A muss escaped werden, damit es als Literal in der Maske vorkommt.

@Theki:

guggst du Mask-Eigenschaft; dort werden sehr schön die einzelnen Maskierungselemente aufgelistet. Und wie man erkennt:

A -> Alphanumerisches Zeichen, optional. Wenn die AsciiOnly-Eigenschaft auf true festgelegt ist, werden die ASCII-Buchstaben a-z sowie A-Z als einzige Zeichen akzeptiert.

Somit dürfte klar sein, weswegen das A (im gegensatz zu P) verschwindet 😉

Gruss Rainer

27.08.2009 - 16:38 Uhr

Geht sowas auch in .NET ?

Ähm - JA! Guggst du mal im Namespace System.Drawing.Printing.PrinterSettings

Auf jeden Fall kannste auch den Drucker mit UNC-Angaben ansprechen 😉

kl. Bsp:


      private void InstallierteDruckerCombo()
      {
         // Listet alle im Computer installierten Drucker in eine ComboBox.
         // Der InstallierteDrucker string dient zur Anzeige des Druckernamen.
         String InstallierterDrucker;
         for(int i = 0;i < System.Drawing.Printing.PrinterSettings.InstalledPrinters.Count;i++)
         {
            InstallierterDrucker = System.Drawing.Printing.PrinterSettings.InstalledPrinters[i];
            comboBoxDrucker.Items.Add(InstallierterDrucker);
         }
			comboBoxDrucker.SelectedIndex = 1;
      }


private void comboBoxDrucker_SelectedIndexChanged ( object sender, EventArgs e )
		  {
		  if ( comboBoxDrucker.SelectedIndex != -1 )
			  {
			  System.Drawing.Printing.PrintDocument pd = new System.Drawing.Printing.PrintDocument ( );
			  pd.PrinterSettings.PrinterName = comboBoxDrucker.Text;
			  propertyGrid1.SelectedObject = pd.PrinterSettings;
			  }
		  }



Der PrinterName kann auch in UNC-Notation (zb. \RechnerNameXYZ\Druckername) übergeben werden.
Das PropertyGrid hab ich hier nur als Veranschaulichung der Eigenschaften eingebaut.

Gruss Rainer

27.08.2009 - 10:11 Uhr

@unclesam:
Die Tabelle "veg_daten" gibt es schon, allerdings nicht unter diesem Namen! Alle Tabellen in einem DataSet werden intern mit Table1, Table2...TableN 'durchnummeriert', wenn man nicht händisch den Tabellen einen aussagekräftigen Namen verpasst.
[EDIT] uups, da war juetho etwas schneller...

17.08.2009 - 17:07 Uhr

Tabellennamen kann man selbstverständlich NICHT mit Parametern übergeben! Wenn Tabellennamen (aus welchem Grunde auch immer) in der verwendeten Database mit Leerzeichen geschrieben werden, dann muss je nach Database der Tabellenname in einfache Hochkommata ( ' ) oder doppelte (") oder ('') oder in eckigen Klammern ([]) eingefasst werden. Hilfreich ist hierzu natürlich das Manual zur Database 😉

Gruss
Rainer

16.08.2009 - 14:50 Uhr

Jetzt möchte ich aber auflisten welche Daten er gerne geändert hätte, denn in
dem Dataset kann er ja ohne weiteres die Daten ändern . Nur bei update in die
reale Datenbank kommt erst die Fehlermeldung , dass er das nicht darf.

Hä ?( Mit Verlaub: was soll das denn? Wenn ein User KEINE Daten (ver)ändern soll, dann unterbinde das auch in der GUI (Textboxen auf ReadOnly, DataGridView ebenso, ...)
Alles andere ist m.E. Irreführung bzw Verar..... des Anwenders.

Gruss Rainer

14.08.2009 - 10:51 Uhr

Moin,

ich hab da noch mal ein bischen 'gegraben' und probiert und bin auf eine praktikable Lösung gekommen: die 'Inhalte'=Text des Items etc vertauschen ...


/*Hinweis: Listview-Eigenschaften MultiSelect=false; Sorting=None */
	 /* Event für die Buttons buttonUP und buttonDOWN */
	  private void itemInGruppe_UPDOWN ( object sender, EventArgs e )
		  {

		  //--wenn nix markiert, dann tue auch nix
		  if ( listView1.SelectedItems.Count == 0 )
			  return;

		  //-- 
		  int delta = ( sender == buttonUP ) ? -1 : +1;

		  //--selektiertes Item in einer Gruppe
		  ListViewItem selItem = listView1.SelectedItems [ 0 ];

		  //--Index des Items innerhalb der ListViewItemCollection
		  int selIndex = listView1.SelectedIndices [ 0 ];

		  //--neue Position innerhalb der Gruppe feststellen
		  int neuePositionInGruppe = selItem.Group.Items.IndexOf ( selItem ) + delta;

		  //--wenn selektiertes Item am Anfang steht dann ans Ende der Gruppe
		  if ( neuePositionInGruppe == -1 ) { neuePositionInGruppe = selItem.Group.Items.Count-1; }

		  //--wenn selektiertes Item am Ende der Gruppe dann an Anfang verschieben
		  if ( neuePositionInGruppe >= selItem.Group.Items.Count ) { neuePositionInGruppe = 0; }

		  //--Index des Items innerhalb der Gruppe vor oder nach dem selektierten Item
		  int newIndex = selItem.Group.Items [ neuePositionInGruppe ].Index;


		  //--DummyItem als Zwischenpuffer für das selektierte Item
		  /* ggf noch Images und /oder Tags mit berücksichtigen, sofern vorhanden */

		  ListViewItem dummy = new ListViewItem ( listView1.Items [ selIndex ].Text );
		  dummy.SubItems.Add ( listView1.Items [ selIndex ].SubItems [ 1 ].Text );
		  dummy.SubItems.Add ( listView1.Items [ selIndex ].SubItems [ 2 ].Text );

		  //--Itemtext etc des Items der neuen Position auf das selektierte Item 'verschieben'
		  listView1.Items [ selIndex ].Text = listView1.Items [ newIndex ].Text;
		  listView1.Items [ selIndex ].SubItems [ 1 ].Text = listView1.Items [ newIndex ].SubItems [ 1 ].Text;
		  listView1.Items [ selIndex ].SubItems [ 2 ].Text = listView1.Items [ newIndex ].SubItems [ 2 ].Text;

		  //--Text etc des selektiertem Items an die neue Position
		  listView1.Items [ newIndex ].Text = dummy.Text;
		  listView1.Items [ newIndex ].SubItems [ 1 ].Text = dummy.SubItems [ 1 ].Text;
		  listView1.Items [ newIndex ].SubItems [ 2 ].Text = dummy.SubItems [ 2 ].Text;

		  //--Selektion des zuvor selektierten Items jetzt auf die neue Position festlegen
		  listView1.Items [ newIndex ].Selected = true;

		  //--ListView wieder in den Focus bringen
		  listView1.Focus ( );

		  }


Gruss Rainer

11.08.2009 - 15:26 Uhr

Moin 🙂

Das besch.... ListView bekommt die Reihenfolge der Items innerhalb einer Gruppe nicht gebacken, sobald ein Item verschoben werden soll. Habe mal testweise statt .Insert die Methode .Add genommen -> das Ergebnis ist das gleiche: das selektierte Item wird einfach stumpf an das Ende der entsprechenden Gruppe plaziert 🙁

Gruss Rainer

02.07.2009 - 14:10 Uhr

Mit Murks meinte ich: Wenn man einfach blind Hochkommata um die Spaltennamen setzt und sich dann wundert...

Wie ich schon schrieb, die SQL-Statements kommen vom Benutzer

AUA! Der Benutzer darf selbst sein Statement zusammenbasteln.. na denn

Wenn ich * nehme schreit der auch 😛 "[Job-ID] LIKE '**'".

Sorry wenn aufschrei und nur noch mit dem Kopf schütteln kann:
Wenn Job-Id ein Integerfeld ist, dann gehört das LIKE ''** NICHT in das Filterstatement. Auch das habe ich bereits geschrieben... und ein entpsrechendes Beispiel gegeben...

Bin aus der Diskussion raus....
Gruss

02.07.2009 - 13:48 Uhr

string filterExpression = string.Format("'" + dataGridView_Uebersicht.Columns[dataGridView_Uebersicht.SelectedCells[0].ColumnIndex].HeaderText + "' LIKE {0}{1}*'", fragmentwildcard, strgSuchBegriff);

Bei sowas kommt natürlich nur Murks raus...

  1. weg mit den hochkomma um den spaltennamen.

Ich erinnere an eine Aussage von mir: vermeide Spaltennamen mit 'Sonderzeichen'!

schreit er, das LIKE '%%' nicht zuöässig sei .

Ist ja auch richtig! Wildcardzeichen sind nunmal * - auch das habe ich mehrmals in meinen Codeschnipsseln eingetragen.
Selbstverständlich funzt der Filter auch mit
... LIKE ''**

02.07.2009 - 12:49 Uhr

WAS funktioniert nicht richtig??
Wie sieht den der FilterExpression-String aus?

string filterExpression = string.Format(":::

Also: wenn du nach Status filtern möchtest, dann ist logischerweise der Filterausdruck so:

string filterExpression = string.Format("Status LIKE '{0}{1}*'", fragmentwildcard, suchBegriff);