如何调整某些ListView列的大小与ListView的剩余大小成比例

时间:2012-10-16 19:34:49

标签: c# winforms listview

我试图在计算任何静态宽度列宽后,根据剩余大小仅重新调整ListView的某些列的大小。例如,我不希望列,例如数量,价格等......调整大小,但是,我希望通常具有更广泛数据的列(例如名称,描述)变宽。以下是我尝试在下面使用的方法,但它不起作用。

BTW,我在ListView上触发ClientSizeChanged事件时调用此方法。不确定这是否相关。

    public static void ResizeListViewColumns(ListView lv, List<int> fixedColumnIndexes, List<int> nonFixedColumnIndexes)
    {
        int lvFixedWidth = 0;
        int lvNonFixedWidth = 0;
        if (fixedColumnIndexes.Count + nonFixedColumnIndexes.Count != lv.Columns.Count)
        {
            throw new Exception("Number of columns to resize does not equal number of columns in ListView");
        }
        else
        {
            // Calculate the fixed column width
            // Calculate the non-fixed column width
            // Calculate the new width of non-fixed columns by dividing the non-fixed column width by number of non-fixed columns
            foreach (var fixedColumn in fixedColumnIndexes)
            {
                lvFixedWidth += lv.Columns[fixedColumn].Width;
            }

            foreach (var nonFixedColumn in nonFixedColumnIndexes)
            {
                lvNonFixedWidth += lv.Columns[nonFixedColumn].Width;
            }

            int numNonFixedColumns = nonFixedColumnIndexes.Count;
            foreach (var newNonFixedColumn in nonFixedColumnIndexes)
            {
                lv.Columns[newNonFixedColumn].Width = lvNonFixedWidth / numNonFixedColumns;
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

这样的事情应该适合你...在我的示例中,我将每个固定列的“Tag”属性设置为字符串“fixed”,而不是保留固定和不固定索引的列表。

int fixedWidth = 0;
        int countDynamic = 0;

        for (int i = 0; i < listView1.Columns.Count; i++)
        {
            ColumnHeader header = listView1.Columns[i];

            if (header.Tag != null && header.Tag.ToString() == "fixed")
                fixedWidth += header.Width;
            else
                countDynamic++;
        }

        for (int i = 0; i < listView1.Columns.Count; i++)
        {
            ColumnHeader header = listView1.Columns[i];

            if (header.Tag == null)
                header.Width = ((listView1.Width - fixedWidth) / countDynamic);
        }