Drag and Drop C#

Dieses Thema Drag and Drop C# im Forum "Webentwicklung, Hosting & Programmierung" wurde erstellt von w1z4rd2003, 4. Mai 2006.

Thema: Drag and Drop C# Hi Kann mir jemand helfen? Ich habe 2 Listsboxen auf einer Form. Mein Ziel ist es das ich von einer in die anderen...

  1. Hi

    Kann mir jemand helfen?

    Ich habe 2 Listsboxen auf einer Form. Mein Ziel ist es das ich von einer in die anderen Daten herum verschieben kann.

    Code:
    C#-Code: 
    private void lstVereine_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
            {    
                if(lstVereine.Items.Count==0)
                    return;
                string s = lstVereine.Items[lstVereine.IndexFromPoint(e.X,e.Y)].ToString();            
                DragDropEffects dde1=DoDragDrop(s,
                    DragDropEffects.All);
                
                if(dde1 == DragDropEffects.All )
                {
                    lstVereine.Items.RemoveAt(lstVereine.IndexFromPoint(e.X,e.Y));                
                }        
                
            }
    
    private void lstAusgewählteVereine_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
            {
                if(e.Data.GetDataPresent(DataFormats.StringFormat))
                {                
                    string str= (string)e.Data.GetData(DataFormats.StringFormat);
                    lstVereine.Items.Add(str);                
                }
                
            }
    
    private void lstAusgewählteVereine_DragOver(object sender, System.Windows.Forms.DragEventArgs e)
            {
                e.Effect=DragDropEffects.All;
            }  
     


    Im Designer steht in einer Listbox folgendes

    C#-Code:
    Code:
    this.lstAusgewählteVereine.DragOver += new System.Windows.Forms.DragEventHandler(this.lstAusgewählteVereine_DragOver);
    this.lstAusgewählteVereine.DragDrop += new System.Windows.Forms.DragEventHandler(this.lstAusgewählteVereine_DragDrop);  
     


    und in der zweiten

    C#-Code:
    Code:
    this.lstVereine.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lstVereine_MouseDown);  


    Das grösste Problem ist das in eine Listbox an einer DataSource angehängt wird und ich bekomme folgende Meldung


    An unhandled exception of type->System.ArgumentException' occurred in system.windows.forms.dll

    Additional information: Cannot modify the Items collection when the DataSource property is set.



    MFG
    w1z4rd2003
     
  2. Mehr Informationen wären hilfreich. Z.B.: Willst Du die Daten in der DB verändern? Das berücksichtige ich hier jetzt nicht, d.h., den PK lasse ich wegfallen. Drag&Drop funktioniert jedenfalls nicht zusammen mit gesetzter DataSource, wie Du ja schon gemerkt hast. Die Verbindung wieder zu lösen, hilft auch nicht (und wenn, wäre der Weg über Data Binding eh sinnlos). Du kannst aber die Liste von Hand füllen.

    Wenn Du die Daten in der DB selbst nicht verändern willst z.B. einfach über einen DataReader. Falls Du interaktive Joins brauchst und/oder filtern willst und die Datenmenge überschaubar ist, könntest Du nötigen Tables holen und bei Bedarf lokale Views erzeugen (und die Rows dann in die ListBox eintragen). Oder Du machst eben komplett neue Abfragen bzw. schreibst eine Stored Procedure.

    Einfaches Füllen einer ListBox von Hand (SQL Server); im realen Code natürlich mögliche Timeouts berücksichtigen und sonstige Fehler abfangen:

    Code:
    using System.Data;
    using System.Data.SqlClient;
    
    ...
    
    string connectionStr = ...
    
    ...
    
    string queryStr =
      SELECT ProductName  +
      FROM Products JOIN Categories  + 
      ON Products.CategoryID = Categories.CategoryID  + 
      ORDER BY ProductName;
    
    ...
    
    private void FillListBox1(string query) {
      SqlConnection connection = new SqlConnection(connectionStr);
      DataSet ds = new DataSet();
      SqlDataAdapter adapter = new SqlDataAdapter(query, connection);
      adapter.Fill(ds);
    
      foreach(DataRow dr in ds.Tables[0].Rows) {
        listBox1.Items.Add(dr[0].ToString());
      }
    }
    
    Drag&Drop zwischen zwei ListBox-Controls:
    http://msdn.microsoft.com/library/d...rmsControlClassDoDragDropTopic.asp?frame=true
     
  3. In der Fehlermeldung steht doch schon was der Fehler ist. Entweder du füllst das von Hand oder du mußt das, was du einfügen willst in die DataSource einfügen.

    Gruß
    Christian
     
  4. Hi zusammen... als erstens mal danke für die Antworten

    in meinem Code steht folgdendes:


    Code:
    private void FillListBox1(string query )
    		{
    			SqlConnection connection = new SqlConnection(conString);
    			DataSet ds = new DataSet();
    			SqlDataAdapter adapter = new SqlDataAdapter(query, connection);
    			adapter.Fill(ds);
    
    			foreach(DataRow dr in ds.Tables[0].Rows) 
    			{
    				lstVereine.Items.Add(dr[0].ToString());
    			}
    		}

    SQL String

    Code:
    	string queryStr = SELECT tblMannschaften.Mannschaftsname  +
    			FROM (tblMannschaften INNER JOIN tblKategorie  +
    			ON tblMannschaften.[FK Kategorie_ID] = tblKategorie.[PK Kategorie_ID])  +
    			WHERE (tblMannschaften.[FK Kategorie_ID] = ?);
    Wenn ich eine Kategorie aus der Combobox auswähle wird folgendes ausgelöst

    Code:
    		private void cmbKategorien_SelectedIndexChanged(object sender, System.EventArgs e)
    		{					
    			dataSet11.tblMannschaften.MannschaftsnameColumn.Table.Clear();
    			con.Open(conString,null,null,0);
    			FillListBox1(queryStr);
    		}
    Ich bekomme aber folgendes Meldung auf die Zeile:
    SqlConnection connection = new SqlConnection(conString);

    Additional information: Keyword not supported:->provider'.

    ???'
     
  5. Dein Connection-String ist falsch. Wenn Du SqlConnection (das Beispiel war für SQL Server, wie gesagt) verwendest, steht der Provider ja fest; da gibt es kein Keyword provider. Mache es so wie vorher, was die Verbindung angeht (als die ListBox noch gefüllt wurde).

    BTW: Die Daten könntest Du beim Drag&Drop auch direkt aus der angeschlossenen Tabelle (oder einer Kopie) entfernen bzw. in sie einfügen, aber das wäre hier wahrscheinlich keine besonders gute Idee. Der Weg über eine an die ListBox gebundene Standard-Collection (mit entsprechender Schnittstelle), in welche die Daten kopiert werden, wäre auch möglich. Ich würde hier eher die vorgeschlagene Variante wählen.

    // Nachtrag
    Du verwendest eine ComboBox, um die Kategorie auszuwählen? Dann binde diese doch an die Kategorien (tblKategorie), setze DisplayMember auf den Namen der Kategorienamen-Zeile, ValueMember auf den Namen der ID-Zeile. Wenn etwas ausgewählt wird, baust Du den Query-String zusammen [so in der Art:
    string queryMansch =
      SELECT Mannschaftsname +
      FROM tblMannschaften +
      WHERE [FK Kategorie_ID] =->;
    ...
    FillListBox1(queryMansch + comboBox.SelectedValue.ToString() +-> ORDER BY Mannschaftsname);
    ]
    Natürlich die Listbox in FillListBox1 erst leeren.
    Also mehr oder weniger die Minimallösung. Es geht zwar auch anders, aber das sollte eigentlich reichen.
     
  6. Hi Dings

    Ich habe jetzt diesen String erstellt

    Code:
    string queryMansch = 
    			SELECT Mannschaftsname  +
    			FROM tblMannschaften  +
    			WHERE [FK Kategorie_ID] =->;
    Danach folgende Methode

    Code:
    private void FillListBox1(string queryMansch )
    		{
    			SqlConnection connection = new SqlConnection(queryMansch);
    			DataSet ds = new DataSet();
    			SqlDataAdapter adapter = new SqlDataAdapter(queryMansch, connection);
    			adapter.Fill(ds);
    
    			foreach(DataRow dr in ds.Tables[0].Rows) 
    			{
    				lstVereine.Items.Add(dr[0].ToString());
    			}
    		}

    und im Ereigniss SelectedIndexChanged folgendes


    Code:
    private void cmbKategorien_SelectedIndexChanged(object sender, System.EventArgs e)
    		{					
    			dataSet11.tblMannschaften.MannschaftsnameColumn.Table.Clear();
    			con.Open(conString,null,null,0);
    			FillListBox1(queryMansch + cmbKategorien.SelectedValue.ToString());
    		}
    Bekomme aber folgender Fehler

    Additional information: Format of the initialization string does not conform to specification starting at index 0.
     
  7. Code:
    private void FillListBox1(string queryMansch )
    {
      SqlConnection connection = new SqlConnection(queryMansch);
    
    queryMansch ist der Abfrage-String, Du verwendest queryMansch als Connection-String.
    Benutzt Du denn überhaupt SQL Server? Wenn nicht, kannst Du auch nicht die Sql...-Klassen verwenden.

    OleDB
    http://msdn.microsoft.com/library/d...brary/DEU/cpref/html/frlrfsystemdataoledb.asp

    Connection-String
    http://msdn.microsoft.com/library/d...oledbconnectionclassconnectionstringtopic.asp

    SQL (-Server)
    http://msdn.microsoft.com/library/d...y/DEU/cpref/html/frlrfsystemdatasqlclient.asp

    Connection-String
    http://msdn.microsoft.com/library/d...ntsqlconnectionclassconnectionstringtopic.asp

    -

    In cmbKategorien_SelectedIndexChanged brauchst Du keine Verbindung zu öffnen, das wird in adapter.Fill automatisch gemacht. Außerdem benutzt Du dort eh eine andere Verbindung (auf con wird in FillListBox1 gar nicht zugegriffen; dort wird lokal eine neue Verbindung - connection - erstellt). Ich nehme an, dass Du con für die ComboBox verwendest. Dann kannst Du in FillListBox1 statt connection auch con nehmen.

    -

    Wenn Du den ersten Teil des Abfrage-Strings mit = ' beendest:

    WHERE [FK Kategorie_ID] = ';

    musst Du ihn auch mit ' schließen:

    FillListBox1(queryMansch + cmbKategorien.SelectedValue.ToString() + ');

    Falls es sich beim Schlüssel um eine Zahl handelt (int?), kannst Du beide ' weglassen:

    ...
    WHERE [FK Kategorie_ID] = ;

    ...
    FillListBox1(queryMansch + cmbKategorien.SelectedValue.ToString());
     
  8. Ich benutze Access  :-\


    Ich habs mal so codiert:

    Code:
    public const string conString = Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\db1.mdb;
    Code:
    string queryMansch = 
    			SELECT Mannschaftsname  +
    			FROM tblMannschaften  +
    			WHERE [FK Kategorie_ID] = ;

    Code:
    private void FillListBox1(string conString)
    		{
    			OleDbConnection connection = new OleDbConnection(conString);
    			DataSet ds = new DataSet();
    			OleDbDataAdapter adapter = new OleDbDataAdapter(conString, connection);
    			adapter.Fill(ds);
    
    			foreach(DataRow dr in ds.Tables[0].Rows) 
    			{
    				lstVereine.Items.Add(dr[0].ToString());
    			}
    		}

    und im selectedindexchanged ereigniss

    Code:
    FillListBox1(queryMansch + cmbKategorien.SelectedValue.ToString());
    Bekomme aber jetzt diese Meldung:

    Additional information: An OLE DB Provider was not specified in the ConnectionString. An example would be,->Provider=SQLOLEDB;'.
     
  9. Jetzt hast Du das Kind mit dem Bade ausgeschüttet, sozusagen. ;)

    Code:
    private void FillListBox1(string queryMansch)
    {
      OleDbConnection connection = new OleDbConnection(conString);
      OleDbDataAdapter adapter = new OleDbDataAdapter(queryMansch, connection);
      DataSet ds = new DataSet();
      adapter.Fill(ds);
    
      foreach(DataRow dr in ds.Tables[0].Rows) 
      {
        lstVereine.Items.Add(dr[0].ToString());
      }
    }
    
    Leider ist das wahrscheinlich nicht die Ursache des Fehlers, der ja in dieser Zeile auftritt:

    OleDbConnection connection = new OleDbConnection(conString);

    Du hast sonst nirgendwo ein SqlConnection oder OleDbConnection-Objekt in Deinem Programm, oder? Wenn Du das Programm im Debug-Mode startest und in der Messagebox auf Break klickst, wenn der Fehler auftritt, wird doch die oben genannte Zeile markiert?

    Der Connection-String sieht ok aus (vorausgesetzt, die Datei C:\db1.mdb existiert und es gibt kein Passwort; aber sonst müsste es eigentlich andere Fehlermeldungen geben). Hast Du mal probiert, über Visual Studio eine Verbindung zu erstellen (über den Server Explorer oder Tools -> Connect to Database).
    Bevor Du wegen dem Drag&Drop gefragt hast, hattest Du doch schon Daten in der Listbox. Also muss es ja irgendwo, irgendwann ein korrekt initialisiertes OleDbConnection-Objekt in Deinem Programm gegeben haben.
     
  10. Hi Ding

    Es funktioniert jetzt! :) Danke für deine Hilfe
     
Die Seite wird geladen...

Drag and Drop C# - Ähnliche Themen

Forum Datum
Drag & Drop funktioniert teilweise nicht mehr Windows 10 Forum 14. Jan. 2016
Thunderbird: Drag&Drop in den Dateimanager geht nicht direkt... E-Mail-Programme 18. Feb. 2014
Beim Spieleexplorer geht Drag & Drop nicht mehr, manuell angelegte Spiele haben keine Funktion & kei Windows 7 Forum 16. Apr. 2010
Beliebige Dateisortierung mit drag&drop Windows 7 Forum 28. Okt. 2009
[GELÖST] Drag & Drop von Dateien Software: Empfehlungen, Gesuche & Problemlösungen 4. Aug. 2009