Visual Studio WPF - wie mehrspaltige Tabelle erstellen und füllen?



  • Hallo ihr,

    brauche mal wieder eure Hilfe!
    Ich möchte ein Projekt erstellen in dem ich Daten in eine "Tabelle" laden kann und dort auch auswählen kann.
    Z.B:
    Ich habe:
    TextBox1 [Vorname]
    TextBox2 [Name]
    Button [Hinzufügen]

    Wenn ich den Button drücke sollen die eingegebenen Daten in der "Tabelle" (also wahrscheinlich ListView/ListBox o.ä.) eingetragen werden.
    Außerdem soll ich in dieser "Tabelle" auch Zeilen auswählen können um diese dann später noch zu verarbeiten.

    Meine Frage ist jetzt welches Steuerelement eignet sich jetzt am besten/einfachsten dafür? Da es ja mehrere Spalten sind steh ich irgendwie auf dem Schlauch... Einspaltig ist ja ganz einfach aber so...

    Habe jetzt schon lange bei google gesucht und 1000 verschiedene Lösungen gefunden die fast alle irgendwie für mich (noch)zu kompliziert waren!
    Was meint ihr? Wie kann man das einfach umsetzen?

    Vielen Dank schon mal!!!



  • Abend

    Es gibt 2 Möglichkeiten, wobei ich die erste für deinen Fall bevorzugen würde:

    1. DataGrid, einfach die Spalten definieren, die du willst und an die ItemsSource hängst du deine Datenquelle.

    2. ItemsControl nehmen und das Celltemplate mit einem Grid und GridScore an den Spalten definieren.

    Grus mdn



  • Danke Marco,

    habe mich jetzt noch mal etwas ausführlicher damit beschäftigt... sieht auf jeden Fall ganz gut aus - brauche aber noch etwas Zeit um damit richtig klar zu kommen!

    Jetzt habe ich aber erstmal ein anderes Problem!

    Ich habe in VS2013 eine neue Datenquelle/DataSet hinzugefügt und versuche jetzt auf diese zuzugreifen leider bekomme ich in Zeile 23 einen Fehler!

    Der Programmteil:

    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Data.SqlClient;
    using System.Data;
    
    namespace SQL1
    {
        /// <summary>
        /// Interaktionslogik für MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                SqlConnection con = new SqlConnection();
                con.ConnectionString = "Data Source=.\\TESTDB.mdf";
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = con;
                cmd.CommandText = "SELECT Name";
                DataSet ds = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(ds, "Spieler");
            }
        }
    }
    

    Die DB:
    https://dl.dropboxusercontent.com/u/42890317/c-sharp/DB.PNG
    Der Fehler:
    https://dl.dropboxusercontent.com/u/42890317/c-sharp/error.PNG

    Liegt das daran das die DB noch leer ist?



  • Hallo

    Nein du solltest dir die Fehlermeldung etwas besser durchlesen, da müsst etwas von Syntax-Fehler drin stehen.

    Das kommt daher, das du mit der Zuweisung

    cmd.CommandText = "SELECT Name";
    

    kein vollständiges SQL angegeben hast.
    Und zwar hast du nur gesagt, welche Spalte du möchtest aber nicht von welcher Tabelle, dies müsste dann so lauten:
    SELECT <Column> FROM <Table> (zB: select Name from Spieler).

    Ansonst schaut alles soweit gut aus.

    edit: Bilder zu spät angeschaut

    Dein eigentlich erster Fehler scheint der Aufbau zur Datenbank (zur mdf-Datei) zu sein. Hast du geprüft ob die mdf-Datei zu der du dich verbinden möchtest auch wirklich mit in deinem bin\debug-Verzeichnis liegt (also direkt neben deiner Exe-Datei)?

    Mfg mdn



  • okay, Vielen Dank!

    den SQL Befehl habe ich geändert! Das geht jetzt...

    Trotzdem scheinst du irgendwie recht zu haben - er kriegt keine Verbindung zur DB...
    Habe den Code jetzt so geändert:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Data.SqlClient;
    using System.Data;
    
    namespace SQL1
    {
        /// <summary>
        /// Interaktionslogik für MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                SqlConnection con = new SqlConnection();
                con.ConnectionString = "Data Source=.\\TESTDB.mdf";
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = con;
                cmd.CommandText = "SELECT Name FROM Spieler";
                DataSet ds = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter(cmd);
    
                try
                {
                    con.Open();
                    SqlCommand cmd1 = new SqlCommand("INSERT INTO Spieler(ProductName) " + "VALUES('Schweizer Käse')");
                    cmd1.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    //Do nothing...
                }
    
                //da.Fill(ds, "Spieler");
            }
       }
    }
    

    Und in Zeile 38 geht er in den Timout und springt in den "catch" rein!
    Wie kriege ich jetzt eine Verbindung zu einer localen .mdf?



  • So, habe es endlich hingekriegt... War ne schwere geburt... 🙄

    der connectionSring musste so sein:

    con.ConnectionString = "Data Source=(LocalDB)\\v11.0;AttachDbFilename=E:\\Programmieren\\VS2013\\SQL1\\SQL1\\bin\\Debug\\TESTDB.mdf;Integrated Security=True;Connect Timeout=30";
    

    Außerdem hatte ich einen Tabellenparameter vergessen...

    Ach ja, noch eine Frage! Ich nutze die Datenbank ja lokal - wenn ich jetzt das Programm auf einen anderen Rechner nutzen möchte, brauche ich dann trotzdem einen SQL Server oder läuft das Programm dann auch so?



  • Du brauchst die DB überall da, wo dein Programm läuft, es sei denn du hast einen Server auf dem du die DB zentral hosten kannst.



  • PuppetMaster2k schrieb:

    Du brauchst die DB überall da, wo dein Programm läuft, es sei denn du hast einen Server auf dem du die DB zentral hosten kannst.

    Vielleicht habe ich mich schlecht ausgedrückt...

    Also ich meinte folgendes Szenario!

    Ich will das Programm auf dem PC eines Kumpels starten... ICh nehme die .exe und die .mdf (also die Datenbank) auf einen Stick mit und Kopiere die auf seinen Rechner!
    Wird das Programm laufen? Oder muss ich dort erst mal einen SQL Server o.ä. installieren?



  • LocalDB ist extra als "embedded database" ausgelegt: Introducing LocalDB, an improved SQL Express

    Andere "embedded database" Varianten sind SQLite, SQL Server Compact o.ä.

    Du solltest aber den ConnectionString so ändern, daß der "AttachDbFilename" einen relativen Pfad benutzt (sonst muß auf dem anderen Rechner ja genau der gleiche Pfad wie auf deinem Rechner benutzt werden)!



  • Th69 schrieb:

    LocalDB ist extra als "embedded database" ausgelegt: Introducing LocalDB, an improved SQL Express

    Andere "embedded database" Varianten sind SQLite, SQL Server Compact o.ä.

    Du solltest aber den ConnectionString so ändern, daß der "AttachDbFilename" einen relativen Pfad benutzt (sonst muß auf dem anderen Rechner ja genau der gleiche Pfad wie auf deinem Rechner benutzt werden)!

    As we said before, at the heart of LocalDB is the same sqlservr.exe as in the regular SQL Express and other editions of SQL Server. In case of LocalDB, it is installed into one central location together with all necessary DLLs. By default it is located at "C:\Program Files\Microsoft SQL Server\110\LocalDB\Binn".

    When an application uses any of the client-side providers (like ADO.NET, ODBC or PDO) to connect to "Data Source=(localdb)\v11.0", the provider will first check if LocalDB instance for the current user is started. If it's already started the application will connect to it. Otherwise the LocalDB instance for the current user will be started and then the provider proceeds to connect to it. Note that each user (Windows login) may have their own LocalDB instance that is isolated from instances of other users.

    Also muss ich aber trotzdem auf den ausführenden Rechner zumindest LocalDB installiert haben - oder wie ist das zu verstehen?

    Aber wie kriege ich das mit dem relativen Pfad hin? Ich habe ja es ja schon mit:

    con.ConnectionString = "Data Source=(LocalDB)\\v11.0;AttachDbFilename=.\\TESTDB.mdf;Integrated Security=True;Connect Timeout=30";
    

    Aber dann findet er die DB nicht mehr! Oder ist das so auch falsch?


Anmelden zum Antworten