Как я могу добавить в настраиваемый пользовательский список управления такими задачами, как редактирование групп столбцов элементов? - PullRequest
0 голосов
/ 29 мая 2020

Причина этого элемента управления - заставить список перестать мерцать при прокрутке. Мерцание прекратилось, и он работает нормально, но элемент управления listview не имеет тех же свойств, что и обычный список winforms.

На этом снимке экрана вид списка с окном ListView Tasks - это обычный список, а меньший прямоугольник - пустой - это настраиваемый элемент управления.

ListView

Это код просмотра списка настраиваемого элемента управления:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace FileSearcher
{
    public partial class ListViewCostumControl : UserControl
    {
        public static ListViewControl lvnf;

        public ListViewCostumControl()
        {
            InitializeComponent();

            lvnf = new ListViewControl();
            lvnf.Location = new Point(50, 50);
            lvnf.Size = new Size(50, 50);
            lvnf.View = View.Details;
            lvnf.Dock = DockStyle.Fill;
            lvnf.SuspendLayout();
            lvnf.LabelEdit = true;
            lvnf.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
            lvnf.Columns.Add("", 984, HorizontalAlignment.Left);
            lvnf.Sorting = SortOrder.None;
            this.Controls.Add(lvnf);
            lvnf.ResumeLayout(false);
        }

        public class ListViewControl : System.Windows.Forms.ListView
        {
            public ListViewControl()
            {
                //Activate double buffering
                this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);

                //Enable the OnNotifyMessage event so we get a chance to filter out 
                // Windows messages before they get to the form's WndProc
                this.SetStyle(ControlStyles.EnableNotifyMessage, true);
            }

            protected override void OnNotifyMessage(System.Windows.Forms.Message m)
            {
                //Filter out the WM_ERASEBKGND message
                if (m.Msg != 0x14)
                {
                    base.OnNotifyMessage(m);
                }
            }
        }

        private void ListViewNFTest_Load(object sender, EventArgs e)
        {

        }
    }
}

1 Ответ

0 голосов
/ 29 мая 2020

Я добавил столбцы самостоятельно и получил то же представление, что и исходный элемент управления списком.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace FileSearcher
{
    public partial class ListViewCostumControl : UserControl
    {
        public static ListView lvnf;

        public ListViewCostumControl()
        {
            InitializeComponent();

            lvnf = new ListView();
            lvnf.Location = new Point(50, 50);
            lvnf.Size = new Size(50, 50);
            lvnf.View = View.Details;
            lvnf.Dock = DockStyle.Fill;
            lvnf.HideSelection = false;
            lvnf.MultiSelect = false;

            //lvnf.SuspendLayout();
            //lvnf.LabelEdit = true;
            //lvnf.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
            lvnf.Columns.Add("Path", 212, HorizontalAlignment.Left);
            lvnf.Columns.Add("Path", 90, HorizontalAlignment.Right);
            lvnf.Columns.Add("Last modified", 120, HorizontalAlignment.Left);
            lvnf.Columns.Add("", 984, HorizontalAlignment.Left);
            lvnf.Sorting = SortOrder.None;
            this.Controls.Add(lvnf);
            lvnf.ResumeLayout(false);
        }

        public class ListView : System.Windows.Forms.ListView
        {
            public ListView()
            {
                //Activate double buffering
                this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);

                //Enable the OnNotifyMessage event so we get a chance to filter out 
                // Windows messages before they get to the form's WndProc
                this.SetStyle(ControlStyles.EnableNotifyMessage, true);
            }

            protected override void OnNotifyMessage(System.Windows.Forms.Message m)
            {
                //Filter out the WM_ERASEBKGND message
                if (m.Msg != 0x14)
                {
                    base.OnNotifyMessage(m);
                }
            }
        }

        private void ListViewNFTest_Load(object sender, EventArgs e)
        {

        }
    }
}

Работает хорошо, без мерцания.

...