none
Фиксированная ширина столбца в ListView (режим List) / C# Windows Forms RRS feed

  • Вопрос

  • Доброго дня!

    Не могу побороть в ListView (в режиме List) колонку. Даже на простой форме с контролом проявляется эффект. На ListView создаю Column, задаю ему ширину, например, 50. Делаю коллекцию Items-ов, вывожу их на экран. Всё хорошо, ширина соблюдается, слова обрезаются. Но, стоит только поменять текст на одном из Item'ов, причем на тот же самый текст, как колонка расширяется до ширины этого текста. Делать после каждого изменения Columns[0].Width не очень хорошо в моем случае, потому что из-за раздвигания колонки появляется горизонтальный скроллинг, который сразу исчезает после задания ширины, но мигание его иногда бывает видно.

    Как можно побороть? События ColumnWidthChanged и ColumnWidthChanging реагируют только на ручное изменение столбцов, когда мышью тащат.

    Для примера:

    using System;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication9
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.None);
                listView1.AutoResizeColumn(0, ColumnHeaderAutoResizeStyle.None);
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                var l = listView1.FindItemWithText("hg");
                if (l != null)
                {
                    l.Text = l.Text.Trim();
                }
            }
        }
    }

    Ну и форма, которую дизайнер сгенерил:

    namespace WindowsFormsApplication9
    {
        partial class Form1
        {
            /// <summary>
            /// Требуется переменная конструктора.
            /// </summary>
            private System.ComponentModel.IContainer components = null;
    
            /// <summary>
            /// Освободить все используемые ресурсы.
            /// </summary>
            /// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
    
            #region Код, автоматически созданный конструктором форм Windows
    
            /// <summary>
            /// Обязательный метод для поддержки конструктора - не изменяйте
            /// содержимое данного метода при помощи редактора кода.
            /// </summary>
            private void InitializeComponent()
            {
                System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem("hgjhgjkhj5r6565");
                System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("truyrtuytyutr");
                System.Windows.Forms.ListViewItem listViewItem3 = new System.Windows.Forms.ListViewItem("tyujtyutryu");
                System.Windows.Forms.ListViewItem listViewItem4 = new System.Windows.Forms.ListViewItem("ghjghjfhj");
                System.Windows.Forms.ListViewItem listViewItem5 = new System.Windows.Forms.ListViewItem("tryutruytruy");
                System.Windows.Forms.ListViewItem listViewItem6 = new System.Windows.Forms.ListViewItem("tyjujrtuyeuy");
                System.Windows.Forms.ListViewItem listViewItem7 = new System.Windows.Forms.ListViewItem("ertertewrte");
                System.Windows.Forms.ListViewItem listViewItem8 = new System.Windows.Forms.ListViewItem("reterterterter");
                System.Windows.Forms.ListViewItem listViewItem9 = new System.Windows.Forms.ListViewItem("erewrtewrt");
                System.Windows.Forms.ListViewItem listViewItem10 = new System.Windows.Forms.ListViewItem("ewrgwerergfwerg");
                this.listView1 = new System.Windows.Forms.ListView();
                this.button1 = new System.Windows.Forms.Button();
                this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
                this.SuspendLayout();
                // 
                // listView1
                // 
                this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
                this.columnHeader1});
                this.listView1.HideSelection = false;
                this.listView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
                listViewItem1,
                listViewItem2,
                listViewItem3,
                listViewItem4,
                listViewItem5,
                listViewItem6,
                listViewItem7,
                listViewItem8,
                listViewItem9,
                listViewItem10});
                this.listView1.LabelWrap = false;
                this.listView1.Location = new System.Drawing.Point(120, 31);
                this.listView1.Margin = new System.Windows.Forms.Padding(0);
                this.listView1.MultiSelect = false;
                this.listView1.Name = "listView1";
                this.listView1.ShowGroups = false;
                this.listView1.Size = new System.Drawing.Size(675, 137);
                this.listView1.TabIndex = 0;
                this.listView1.TileSize = new System.Drawing.Size(60, 15);
                this.listView1.UseCompatibleStateImageBehavior = false;
                this.listView1.View = System.Windows.Forms.View.List;
                // 
                // button1
                // 
                this.button1.Location = new System.Drawing.Point(375, 229);
                this.button1.Name = "button1";
                this.button1.Size = new System.Drawing.Size(75, 23);
                this.button1.TabIndex = 1;
                this.button1.Text = "button1";
                this.button1.UseVisualStyleBackColor = true;
                this.button1.Click += new System.EventHandler(this.button1_Click);
                // 
                // columnHeader1
                // 
                this.columnHeader1.Width = 50;
                // 
                // Form1
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(948, 270);
                this.Controls.Add(this.button1);
                this.Controls.Add(this.listView1);
                this.Name = "Form1";
                this.Text = "Form1";
                this.ResumeLayout(false);
    
            }
    
            #endregion
    
            private System.Windows.Forms.ListView listView1;
            private System.Windows.Forms.ColumnHeader columnHeader1;
            private System.Windows.Forms.Button button1;
        }
    }

    Если нажимаю на кнопку на форме, то столбцы становятся шире, а мне надо что бы оставались такими же.



    • Изменено dllx 15 января 2014 г. 7:10 В заголовке ошибся - ListView в режиме List
    14 января 2014 г. 13:16

Ответы

  • Проблему решил так:

    if (l != null)
       {
           listView1.BeginUpdate();
           l.Text = l.Text.Trim();
           listView1.Columns[0].Width = 50;
           listView1.EndUpdate();
       }
    

    Костыль по сути. Просто не показываются изменения ширины столбца, несмотря на то что они всё таки остались.
    • Помечено в качестве ответа dllx 15 января 2014 г. 7:59
    15 января 2014 г. 7:59