Настраиваемый Listview для .Net? - PullRequest
1 голос
/ 20 марта 2011

вы, ребята, знаете .NET ListView-Replacement, которое может быть сильно настроено?Я занимаюсь разработкой приложения, которое похоже на список задач.Я хочу иметь возможность настраивать почти все визуальные детали списка, поэтому я получаю что-то вроде этого:

ListView

Я также хочу иметь возможность изменять порядок элементов мышкой +перетаскивания.Если вы не знаете ListView, может быть, вы знаете, как я мог бы создать свой собственный список, такой как этот, с нуля?

Спасибо за ваши идеи!

Ответы [ 3 ]

3 голосов
/ 21 марта 2011

Используя элемент управления flowlayoutpanel в качестве контейнера, а затем создайте пользовательский элемент управления, который является элементом списка, вы находитесь на полпути. Пользовательский контроль может иметь любой вид, который вы хотите, и будет действовать как элемент списка в панели потока. Тогда у нас есть перетаскивание. Следуя этому коду (обычно из этого примера: http://www.codeproject.com/KB/static/DragDropFlowLayoutPanel.aspx), вы добавите элементы перетаскивания в панель потока:

Сначала создайте новое решение windform, затем создайте пользовательский элемент управления только с меткой, мы используем его в качестве примера вашего специального элемента управления listitem. Назовите элемент управления MyListItem. Вставьте этот код в пользовательский контроль, чтобы сделать его перетаскиваемым:

Public Class MyListItem
    Public Property AllowDrag() As Boolean
        Get
            Return m_AllowDrag
        End Get
        Set(ByVal value As Boolean)
            m_AllowDrag = value
        End Set
    End Property
    Private m_AllowDrag As Boolean
    Private _isDragging As Boolean = False
    Private _DDradius As Integer = 40
    Private _mX As Integer = 0
    Private _mY As Integer = 0

    Public Sub New()
        InitializeComponent()
        Margin = New Padding(0)
        AllowDrag = True
    End Sub

    Protected Overrides Sub OnGotFocus(ByVal e As EventArgs)
        Me.BackColor = Color.Navy
    End Sub

    Protected Overrides Sub OnLostFocus(ByVal e As EventArgs)
        Me.BackColor = Color.Transparent

    End Sub

    Protected Overrides Sub OnClick(ByVal e As EventArgs)
        Me.Focus()
    End Sub

    Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
        Me.Focus()
        _mX = e.X
        _mY = e.Y
        Me._isDragging = False
    End Sub

    Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
        If Not _isDragging Then
            If e.Button = MouseButtons.Left AndAlso _DDradius > 0 AndAlso Me.AllowDrag Then
                Dim num1 As Integer = _mX - e.X
                Dim num2 As Integer = _mY - e.Y
                If ((num1 * num1) + (num2 * num2)) > _DDradius Then
                    DoDragDrop(Me, DragDropEffects.All)
                    _isDragging = True
                    Return
                End If
            End If
        End If
    End Sub
    Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
        _isDragging = False
    End Sub
End Class

Затем поместите flowlayoutpanel (flowlayoutpanel1) на основную форму в приложении.

Добавьте этот код в форму, он заполнит панель потока списками, которые вы можете перетаскивать:

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

        FlowLayoutPanel1.AllowDrop = True
        For p As Integer = 0 To 50
            Dim listitem As New MyListItem With {.Height = 50, .BorderStyle = BorderStyle.FixedSingle}
            listitem.Label1.Text = "Item:" & p.ToString
            FlowLayoutPanel1.Controls.Add(listitem)
        Next
        AddHandler FlowLayoutPanel1.DragEnter, AddressOf flowLayoutPanel_DragEnter
        AddHandler FlowLayoutPanel1.DragDrop, AddressOf flowLayoutPanel1_DragDrop        
    End Sub

    Sub flowLayoutPanel_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs)
        e.Effect = DragDropEffects.All
    End Sub

    Private Sub flowLayoutPanel1_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs)
        Dim data As MyListItem = CType(e.Data.GetData(GetType(MyListItem)), MyListItem)
        Dim _destination As FlowLayoutPanel = CType(sender, FlowLayoutPanel)
        Dim _source As FlowLayoutPanel = CType(data.Parent, FlowLayoutPanel)
        If sender.Equals(data.Parent) Then
            Dim p As Point = _destination.PointToClient(New Point(e.X, e.Y))
            Dim item = _destination.GetChildAtPoint(p)
            Dim index As Integer = _destination.Controls.GetChildIndex(item, False)
            _destination.Controls.SetChildIndex(data, index)
            _destination.Invalidate()
        End If
    End Sub

Теперь вы можете запустить программу и проверить. Теперь у вас есть «просмотр списка», в котором могут быть настроенные элементы управления, позволяющие перетаскивать элементы для изменения порядка элементов.

Кредит переходит к П.Сэндгрену за перетаскивание элементов на панели разметки:
http://www.codeproject.com/KB/static/DragDropFlowLayoutPanel.aspx

3 голосов
/ 21 марта 2011

Вы можете попробовать ObjectListView (http://objectlistview.sourceforge.net).

. Вы можете получить богатые функции, такие как:

Sample1 http://objectlistview.sourceforge.net/cs/_images/fancy-screenshot3.png
Sample2 http://objectlistview.sourceforge.net/cs/_images/foobar-lookalike.png Sample3 http://objectlistview.sourceforge.net/cs/_images/task-list.png

Одна вещь, которую нужно знать, это то, что вам нужно быть готовым к тому, чтобы делать много вещей на стороне кода вместо обычного конструкторского представления, чтобы получить желаемый уровень функциональности.

3 голосов
/ 20 марта 2011

Используйте WPF ListBox и ItemsTemplate :) check http://msdn.microsoft.com/en-us/library/ms752347.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...