Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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?

  • Autor

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.

  • Autor

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

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

  • Autor

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.

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

  • Autor

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.

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 ;)

  • Autor

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

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

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

  • Autor

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 ;)

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.