Announcement

Collapse
No announcement yet.

DataTable in Listboxen aufteilen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DataTable in Listboxen aufteilen

    Hi zusammen,
    ich habe mal wieder ein Problem, bei dem ich mir allmählich die Zähne ausbeiße -_-


    Arbeite mit
    - Visual Studio 2008
    - ASP.Net
    - C#
    - Microsoft SQL Server Managment Studio

    Mein Problem:
    Ich habe ein Stored Procedure erstellt, welchen ich verwende einen DataTable in C# zu füllen.
    Auf einer Contentpage befinden sich ListBoxen, in welche die DataTabe aufgeteilt werden soll.
    Bsp.:


    key..|.Bereich..|.Thema_ID..|.Thema
    ----------------------------------------
    1....|.Handel...|.1.........|.Waren
    1....|.Handel...|.2.........|.VerkaufVerkauf
    1....|.Handel...|.3.........|.Einkauf
    3....|.Media....|.1.........|.Radio
    2....|.Report...|.1.........|.Zeitung
    3....|.Media....|.2.........|.TV
    4....|.Weitere..|.1.........|.weiteres


    Alles aus Thema mit dem Key 1 möchte ich in lbListbox1 stehen haben.
    Wie stelle ich das an, dass ich nur die erste Zeile bearbeite?

    Code:
    public void BindList()
            {
                string connectionString = "***Stimmt schon***";
    
                using (SqlConnection myDbConnection = new SqlConnection(connectionString))
                {
                    try
                    {
                        myDbConnection.Open();
    
                        SqlCommand myDbCommand = new SqlCommand("StoredPro", myDbConnection);
                        myDbCommand.CommandType = CommandType.StoredProcedure;
                        myDbCommand.ExecuteNonQuery();
                        
                        SqlDataAdapter myDbDataAdapter = new SqlDataAdapter(myDbCommand);
                        
                        DataTable myDataTable = new DataTable();
                        myDbDataAdapter.Fill(myDataTable);
                        
                        DataRow row = myDataTable.Rows[0];
                        DataColumn col = myDataTable.Columns[0];
                        for (int i = 0; i < myDataTable.Rows.Count; i++)
                        {
                            foreach (object item in row.ItemArray)
                            {
                                if (col.ColumnName == "Key")
                                {
                                    if (item.ToString() == "1")
                                    {
                                        lbForHeadline1.DataSource = myDataTable;
                                        lbForHeadline1.DataTextField = "Thema";
                                        lbForHeadline1.DataValueField = "Thema";
                                        lbForHeadline1.DataBind();
                                    }
                                    if (item.ToString() == "2")
                                    {
                                        lbForHeadline2.DataSource = myDataTable;
                                        lbForHeadline2.DataTextField = "Thema";
                                        lbForHeadline2.DataValueField = "Thema";
                                        lbForHeadline2.DataBind();
                                    }
                                    if (item.ToString() == "3")
                                    {
                                        lbForHeadline3.DataSource = myDataTable;
                                        lbForHeadline3.DataTextField = "Thema";
                                        lbForHeadline3.DataValueField = "Thema";
                                        lbForHeadline3.DataBind();
                                    }
                                    if (item.ToString() == "4")
                                    {
                                        lbForHeadline4.DataSource = myDataTable;
                                        lbForHeadline4.DataTextField = "Thema";
                                        lbForHeadline4.DataValueField = "Thema";
                                        lbForHeadline4.DataBind();
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        lblError.Text = ex.Message;
                    }
                    finally
                    {
                        myDbConnection.Close();
                    }
                }
            }
    Danke schonal in voraus, sollte was nicht verständlich sein, bitte bescheid sagen.

    Gruß

    F60.2
    Zuletzt editiert von F60.2; 05.05.2011, 15:47.

  • #2
    Code:
    foreach (object item in row.ItemArray)
    {
        if (col.ColumnName == "Key")
        {
            if (item.ToString() == "1")
            {

    Dieser Codeteil ist höchstwahrscheinlich grober Unfug. col hast du vorher schon auf die erste DataColumn festgelegt und wird sich also innerhalb der Schleife nie ändern. Macht also keinen Sinn den je Schleifendurchlauf zu testen. Maximal einmal vor der Schleife testen reicht.

    Sinnvoller wäre eh sich die Dinge über den Namen zu holen und nicht über ihre Position. Also eher.

    Code:
    DataColumn col = myDataTable.Columns["Key"];
    Wobei ich überhaupt nicht weiß worum du die Column überhaupt ermittelst. Außer die Prüfung machst du nichts damit.

    Dann der foreach über ItemArray also jeweils den Wert in allen 4 Spalten.
    Gleich in der ersten Zeile wirst du die 1 zweimal finden(in Key und in Thema_ID)
    und damit das Binding auch zweimal machen. Das ist so von dir gewünscht? Und das noch für jede Row obwohl du doch immer die Datatable bindest und nicht einzelne Rows?

    Egal. Die gesamte Konstrukt ist vermutlich überflüssig. Ich würde einfach nicht direkt die DataTable binden sondern einen DataView dazwischen schalten mit passendem Filter und Sortierung.

    [Highlight=C#]lbForHeadline1.DataSource = new DataView(myDataTable, "Key = 1", "Thema", DataViewRowState.CurrentRows);
    lbForHeadline2.DataSource = new DataView(myDataTable, "Key = 2", "Thema", DataViewRowState.CurrentRows);
    lbForHeadline3.DataSource = new DataView(myDataTable, "Key = 3", "Thema", DataViewRowState.CurrentRows);
    lbForHeadline4.DataSource = new DataView(myDataTable, "Key = 4", "Thema", DataViewRowState.CurrentRows);
    [/Highlight]

    Comment


    • #3
      Vielen Dank für die super Antwort,
      Habe meinen Code noch einmal umgestellt, nun gehts ^^

      Code:
      public void BindList()
              {
                  string connectionString = "***Stimmt schon***";
      
                  using (SqlConnection myDbConnection = new SqlConnection(connectionString))
                  {
                      try
                      {
                          myDbConnection.Open();
      
                          SqlCommand myDbCommand = new SqlCommand("StoredPro", myDbConnection);
                          myDbCommand.CommandType = CommandType.StoredProcedure;
                          myDbCommand.ExecuteNonQuery();
                          
                          SqlDataAdapter myDbDataAdapter = new SqlDataAdapter(myDbCommand);
                          
                          DataTable myDataTable = new DataTable();
                          myDbDataAdapter.Fill(myDataTable);
                          
                          DataRow row = myDataTable.Rows[0];
                          DataColumn col = myDataTable.Columns["Key"];
                          for (int i = 0; i < myDataTable.Rows.Count; i++)
                          {
                                  if (col.ColumnName == "Key")
                                  {
                                      
                                          lbForHeadline1.DataSource = new DataView(myDataTable, "Key = 1", "Thema", DataViewRowState.CurrentRows);
                                          lbForHeadline1.DataTextField = "Thema";
                                          lbForHeadline1.DataValueField = "Thema";
                                          lbForHeadline1.DataBind();
      
                                          lbForHeadline2.DataSource = new DataView(myDataTable, "Key = 2", "Thema", DataViewRowState.CurrentRows);
                                          lbForHeadline2.DataTextField = "Thema";
                                          lbForHeadline2.DataValueField = "Thema";
                                          lbForHeadline2.DataBind();
      
                                          lbForHeadline3.DataSource = new DataView(myDataTable, "Key = 3", "Thema", DataViewRowState.CurrentRows);
                                          lbForHeadline3.DataTextField = "Thema";
                                          lbForHeadline3.DataValueField = "Thema";
                                          lbForHeadline3.DataBind();
      
                                          lbForHeadline4.DataSource = new DataView(myDataTable, "Key = 4", "Thema", DataViewRowState.CurrentRows);
                                          lbForHeadline4.DataTextField = "Thema";
                                          lbForHeadline4.DataValueField = "Thema";
                                          lbForHeadline4.DataBind();
                                 }
                            }
                      }
                      catch (Exception ex)
                      {
                          lblError.Text = ex.Message;
                      }
                      finally
                      {
                          myDbConnection.Close();
                      }
                  }
              }
      Geht warscheinlich noch schlanker,
      von daher, falls es noch Tipps gibt, nehm ich immer gerne ^^

      Comment


      • #4
        Code:
        for (int i = 0; i < myDataTable.Rows.Count; i++)
        Die Schleife kannst du rauswerfen. Du bindest die DataTable und nicht die Rows. Es lohnt sich also nicht die DataTable je Row zu binden und damit n*mal das selbe zu wiederholen.

        Code:
        if (col.ColumnName == "Key"){
        Diesen Test kannst du dir auch sparen sparen. 'myDataTable.Columns["Key"]' wäre dir schon mit einer Exception um die Ohren geflogen wenn es keine Column mit Namen Key gäbe und die steht ja dauerhaft in col. Obiger Test ist also zu 100% immer true.

        Comment


        • #5
          Nochmals vielen Danke
          Das erleichtert die Übersicht.

          Allerdings habe ich dann direkt noch eine Frage.

          Ich habe nämlich über den ListBoxen einen Label der mit dem
          "Bereich" gefüllt werden soll.
          Da sich die Tabelle mal ändern könnte, soll ich halt kein
          Hardcoding machen.

          key..|.Bereich..|.Thema_ID..|.Thema
          ----------------------------------------
          1....|.Handel...|.1.........|.Waren
          1....|.Handel...|.2.........|.VerkaufVerkauf
          1....|.Handel...|.3.........|.Einkauf
          3....|.Media....|.1.........|.Radio
          2....|.Report...|.1.........|.Zeitung
          3....|.Media....|.2.........|.TV
          4....|.Weitere..|.1.........|.weiteres

          Leider habe ich vergeblich nach einem
          gleichen Lösungsweg gesucht, wie mit den ListBoxen.

          Da gibt es bestimmt auch einen passenden Lösungsweg,
          weiß ihn jemand? Ich suche mich nämlich zur zeit tot.
          Zuletzt editiert von F60.2; 09.05.2011, 15:24.

          Comment


          • #6
            Ich habe jetzt mal etwas herausgesucht.
            Allerdings fliegt er mir so um die Ohren.

            Hier mal ein Ausschnitt:
            Code:
            DataSet dataset1 = new DataSet();
            myDbDataAdapter.Fill(dataset1);
            DataTable table = dataset1.Tables["Key"];
            if (lbForHeadline1.Rows != null)
            {
                   string expression;
                   expression = "1";
                   DataRow[] foundRows;
            
                   foundRows = table.Select(expression);
            
                   for (int i = 0; i < foundRows.Length; i++)
                   {
                          lblHeadline1.Text = foundRows[i]["Bereich"].ToString();
                   }
            }

            Comment


            • #7
              Ok hab jetzt eine bessere Lösung gefunden.
              Nochmals Danke @Ralf.

              Code:
              DataView d1 = new DataView(myDataTable, "Key = 0", "Bereich", DataViewRowState.CurrentRows);
              for (int i = 0; i < myDataTable.Rows.Count; i++)
              {
                       if (d1.Table.Rows[i]["Key"].ToString() == "1" && lbForHeadline1.Rows != null)
                       {
                                 lblHeadline1.Text = d1.Table.Rows[i]["Bereich"].ToString();
                       }
              
              ... usw

              Comment

              Working...
              X