Zum Inhalt springen

[VB.NET] Spalten eines ListViews ausblenden


Empfohlene Beiträge

Geschrieben

Huhu,

momentan blenden wir einige Spalten unserer ListViews aus, indem wir einfach die Width-Eigenschaft auf 0 setzen. Ist leider nicht so sauber, weil man dadurch die Spalte auch einfach wieder manuell größer ziehen kann und sie so wieder sichtbar wird. Gibt es da vielleicht noch eine andere Möglichkeit?

Geschrieben

nein, leider nicht. das einzige was es noch gibt ist ein Remove(), aber das bringt mir auch nix, weil das dann wirklich komplett alles vernichtet und ich die daten in der spalte aber für eine weiterverarbeitung noch brauche.

hm ich könnte das ja irgendwo zwischenspeichern... is aber auch wieder son rumgefrickel.

Geschrieben (bearbeitet)

also momentan seh ich auch einfach nur zwei möglichkeiten:

1. man lebt damit, dass der benutzer die spalte ganz einfach wieder breiter ziehen kann

2. man speichert die werte der spalte irgendwo zwischen und entfernt dann die komplette spalte aus der liste.

bin mit beiden lösungen irgendwie nich so ganz zufrieden, aber die entgültige entscheidung trifft dann eh unsere systemarchitektin :D

Bearbeitet von aline234
Geschrieben

was spricht gegen die verwendung eines DataGridView? dort lassen sich spalten tatsächlich ausblenden.

übrigens würde ich versuchen, berechnungslogik soweit wie möglich aus spalten herauszunehmen, alles andere ist unsauber.

s'Amstel

Geschrieben

die überlegung steht auch gerade im raum, allerdings haben wir viele eigene steuerelemente, die auch ein listview enthalten und das dann alles in datagrids umzumodeln is auch nich gerade wenig arbeit.

wir berechnen auch nix in oder mit unseren spalten. wir müssen nur später alles sauber über id's identifizieren.

Geschrieben

ich denk mal hier gibts einige konzeptionelle probleme und/oder ungereimtheiten :) definiere "alles sauber über id's identifizieren".

wenn du eine nicht fachliche spalte in deiner ListView drin hast, dann würde ich diese wie oben bereits erwähnt über Tag machen. Tag ist nicht sichtbar, aber jederzeit zugreifbar?

gibts hinter den ganzen verwendeten controls eine datenbasis, oder werden die halt nach gutdünken befüllt?

s'Amstel

Geschrieben

ehrlich gesagt is mir dieses zwischenspeichern auch nich so ganz geheuer. soweit ich mich erinnern kann konnte man in vb6 ganz einfach spalten ein- und ausblenden. warum das jetz in .net nich geht is mir irgendwie unklar.

Geschrieben
warum das jetz in .net nich geht is mir irgendwie unklar.

Weil man es nicht braucht, zumindest nicht wenn man damit nur Informationen speichern will die der Anwender nicht sehen soll.

Deswegen aber auch oben die Frage was genau da passiert bzw. passieren soll damit man dir eine Lösungsmöglichkeit nennen kann, sonst bleibt das nur Rätselraten ;)

Geschrieben (bearbeitet)

tja, kurz ausgedrückt: liste wird aus db gefüllt, der anwender kann sich einen eintag aussuchen und die auswahl wieder in die db geschrieben, wofür wir wieder die ausgeblendete id brauchen.

die geschichte mit dem tag property wird hier übrigens nicht gerne gesehen. da gab es wohl zu früheren zeiten dann ungereimtheiten, weil jeder überall irgendwas zwischengespeichert hat und am ende niemand mehr wusste welche information wohin gehört. deshalb wird das bei uns so nicht mehr gehandhabt. deshalb müssen wir jetzt in den nächsten wochen mal überlegen was wir da em besten machen können. die umstellen auf ein datagrid wirds dann wohl doch letztendlich werden.

momentan hat diese problematik aber eher eine sehr niedrige priorität und deshalb wrid sich das eh noch ziemlich lange hinziehen, bis wir das dann gelöst haben.

Bearbeitet von aline234
Geschrieben

hi,

der code braucht nen ListView namens ListView1 und nen button namens Button1

damit kannst du mal testen, wie man eine spalte ausblenden kann;

das adden und removen löscht nicht die daten (das willst du da, oder ;))

    Dim c1 As New System.windows.Forms.ColumnHeader

    Dim c2 As New System.windows.Forms.ColumnHeader


    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load


        ListView1.View = View.Details

        ListView1.FullRowSelect = True

        c1.Text = "fall"

        c1.Width = 100

        c2.Text = "tttttttesssssssssst"

        c2.Width = 200

        With ListView1.Columns

            .Add(c1)

            .Add(c2)

        End With


        With ListView1.Items

            With .Add("test")

                .SubItems.Add("hallo")

            End With

        End With


        ListView1.Columns.Remove(c2)


    End Sub


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        ListView1.Columns.Add(c2)

    End Sub

Geschrieben

ok,

nochmal bisl überarbeitet

notwendig:

listview

und 3 buttons

wenn du auf button 3 klickst, wirst du bemerken, dass die daten dieser spalte noch verfügbar sind, obwohl die spalte ausgeblendet ist

    Dim c1 As New System.windows.Forms.ColumnHeader

    Dim c2 As New System.windows.Forms.ColumnHeader

    Dim c3 As New System.windows.Forms.ColumnHeader


    Dim iIndex As Integer


    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load


        ListView1.View = View.Details

        ListView1.FullRowSelect = True

        c1.Text = "s1"

        c1.Width = 50

        c2.Text = "s2"

        c2.Width = 50

        c3.Text = "s3"

        c3.Width = 50

        With ListView1.Columns

            .Add(c1)

            .Add(c2)

            .Add(c3)

        End With


        With ListView1.Items

            With .Add("1")

                .SubItems.Add("2")

                .SubItems.Add("3")

            End With

        End With


    End Sub


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        ListView1.Columns.Insert(iIndex, c2)

    End Sub


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        iIndex = ListView1.Columns.IndexOf(c2)

        ListView1.Columns.Remove(c2)

    End Sub


    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

        MessageBox.Show(ListView1.Items(0).SubItems(1).Text)

    End Sub

Geschrieben

find ich ja nett, dass du die die ganze arbeit gemacht hast, aber wie guybrush schon erwähnte, war mir das vorher schon klar (--> siehe mein 3ter post in diesem thread). das ist aber in unserem fall etwas ungünstig, weil man dann bei verschiedenen funktionalitäten des listviews (sortieren z.B.) an 2 stellen gleichzeiten rumwerkeln muss.

momentan gucken wir gerade ob eine umstellung auf das data grid an jeder stelle funktionieren wird und zur not müssne wir eben damit leben, dass der benutzer die spalte wieder breiter ziehen kann.

trotzdem aber danke für die vielen tipps und so ;)

Geschrieben (bearbeitet)

die listview funktionalität an sich und die datenhaltung bleibt doch komplett erhalten;

das einzige was du machen musst, ist dir den index des column zu merken, damit du ihn wieder an korrekter position einfügen kannst, da, wenn ein column removed wurde, dieser beim adden wieder an die letzte position hinzugefügt wird (beim insert kann man einen index angeben), aber die daten der zeilen der entsprechenden spalte noch an der selben position bleiben

soll heißen:

bsp:

spalte 1 | 2 | 3

wert: a | b | c

löscht du spalte 2 und fügst sie wieder ein schaut das so aus( wohlgemerkt nur bei add, mit insert gehts)

spalte 1 | 3 | 2

wert: a | b | c

das bsp zeigt aber, dass die werte der zeilen völlig unberührt vom remove bleiben, d.h. du kannst weiterhin sortieren usw und die ausgeblendete spalte sortiert sich dabei mit (siehe code)

    Dim c1 As New System.windows.Forms.ColumnHeader

    Dim c2 As New System.windows.Forms.ColumnHeader

    Dim c3 As New System.windows.Forms.ColumnHeader


    Dim iIndex As Integer


    Private m_Sort As SortOrder = SortOrder.Descending


    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load


        ListView1.View = View.Details

        ListView1.FullRowSelect = True

        c1.Text = "s1"

        c1.Width = 50

        c2.Text = "s2"

        c2.Width = 50

        c3.Text = "s3"

        c3.Width = 50

        With ListView1.Columns

            .Add(c1)

            .Add(c2)

            .Add(c3)

        End With


        With ListView1.Items

            With .Add("1")

                .SubItems.Add("2")

                .SubItems.Add("3")

            End With

            With .Add("2")

                .SubItems.Add("5")

                .SubItems.Add("6")

            End With

            With .Add("3")

                .SubItems.Add("3")

                .SubItems.Add("2")

            End With

        End With


    End Sub


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        ListView1.Columns.Insert(iIndex, c2)

    End Sub


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        iIndex = ListView1.Columns.IndexOf(c2)

        ListView1.Columns.Remove(c2)

    End Sub


    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

        MessageBox.Show(ListView1.Items(0).SubItems(1).Text)

    End Sub


    Private Sub ListView1_ColumnClick(ByVal sender As Object, _

      ByVal e As System.Windows.Forms.ColumnClickEventArgs) _

      Handles ListView1.ColumnClick


        Select Case e.Column

            Case 0

                ListView1.ListViewItemSorter = Nothing

                ListView1.Sorting = m_Sort

            Case 1

                ListView1.ListViewItemSorter = Nothing

                ListView1.Sorting = m_Sort

            Case 2

                ListView1.ListViewItemSorter = Nothing

                ListView1.Sorting = m_Sort

        End Select


        If m_Sort = SortOrder.Ascending Then

            m_Sort = SortOrder.Descending

        ElseIf m_Sort = SortOrder.Descending Then

            m_Sort = SortOrder.Ascending

        End If

    End Sub

Bearbeitet von xk4fu

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...