Настройте столбцы ListView для соответствия WinForms - PullRequest
12 голосов
/ 26 января 2011

У меня проблема с изменением размера лица в столбцах списка. Если вы привязываете / закрепляете представление списка к нормальной форме win, тогда привязка или закрепление просмотра списка работает хорошо. Я имею в виду, что listview будет изменять размеры и соответствовать winforms, так как winforms увеличены, но столбцы, которые вы создали для него, не меняются с listview.

Мой вопрос: Есть ли способ изменить размер столбцов списка с помощью списка, чтобы он соответствовал размеру winform?.

Код дизайна списка:

 private void Form1_Load(object sender, EventArgs e)
    {

        listView1.View = View.Details;
        listView1.LabelEdit = true;
        listView1.BackColor = Color.GreenYellow;
        listView1.Columns.Add("Date", 100, HorizontalAlignment.Left);
        listView1.Columns.Add("TransID", 50, HorizontalAlignment.Left);
        listView1.Columns.Add("voucher", 100, HorizontalAlignment.Right);
        listView1.Columns.Add("particulars", 300, HorizontalAlignment.Left);
        listView1.Columns.Add("deposit", 100, HorizontalAlignment.Right);
        listView1.Columns.Add("withdrawal", 100, HorizontalAlignment.Right);

        string connstr = "server=.;initial catalog=DataBase;uid=UID;pwd=PWD";
        SqlConnection con = new SqlConnection(connstr);
        con.Open();
        listView1.Items.Clear();
        listView1.Refresh();
        string sql = "select date=convert(varchar,date,103),transID,max(particulars)as particulars,sum(deposit)as deposit,sum(withdrawal) as withdrawal,voucher from debank group by date,transID,voucher";
        SqlCommand cmd = new SqlCommand(sql, con);
        SqlDataAdapter dap = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        dap.Fill(ds);
        DataTable dt = ds.Tables[0];

        for (int i = 0; i < dt.Rows.Count; i++)
        {
            DataRow dr = dt.Rows[i];
            ListViewItem lvi = new ListViewItem(dr["date"].ToString());
            lvi.SubItems.Add(dr["transID"].ToString());
            lvi.SubItems.Add(dr["voucher"].ToString());
            lvi.SubItems.Add(dr["particulars"].ToString());
            lvi.SubItems.Add(dr["deposit"].ToString());
            lvi.SubItems.Add(dr["withdrawal"].ToString());
            listView1.Items.Add(lvi);
            listView1.FullRowSelect = true;

        }

        SizeLastColumn(listView1);


    }

Ответы [ 5 ]

29 голосов
/ 26 января 2011
  1. Программный.Вы должны будете поддерживать это в коде.
  2. Вы можете настроить размер последнего столбца в своем списке, чтобы он автоматически изменял размер.Пример выборки:

В элементе управления ListView со свойством View, установленным в Details, можно создать вывод из нескольких столбцов.Иногда вам нужно, чтобы размер последнего столбца ListView занимал все оставшееся пространство.Вы можете сделать это, установив для ширины столбца магическое значение -2. ​​

В следующем примере имя элемента управления ListView - lvSample:

[c#]
private void Form1_Load(object sender, System.EventArgs e)
{
    SizeLastColumn(lvSample);
}

private void listView1_Resize(object sender, System.EventArgs e)
{
    SizeLastColumn((ListView) sender);
}

private void SizeLastColumn(ListView lv)
{
    lv.Columns[lv.Columns.Count - 1].Width = -2;
}

РЕДАКТИРОВАТЬ:

Программно вы можете сделать это с помощью собственного реализованного алгоритма.Проблема в том, что представление списка не знает, какие столбцы вы хотите изменить, а какие нет.Таким образом, вы будете использовать метод resize (или метод resizeEmd), чтобы указать изменение размера всех столбцов.Таким образом, вы вычисляете всю ширину списка, а затем пропорционально делите значение между всеми столбцами.Ширина ваших столбцов кратна 50. Таким образом, у вас есть полная ширина списка 15 * х (x = 50 в состоянии по умолчанию. Я рассчитал 15 значений на основе количества ваших столбцов и их ширины) условных единиц.При изменении размера формы вы можете вычислить новый x = ListView.Width/15, а затем установить ширину каждого столбца на нужное значение, поэтому

private void SizeLastColumn(ListView lv)
{
 int x = lv.Width/15 == 0 ? 1 : lv.Width/15;
 lv.Columns[0].Width = x*2; 
 lv.Columns[1].Width = x;
 lv.Columns[2].Width = x*2;
 lv.Columns[3].Width = x*6;
 lv.Columns[4].Width = x*2;
 lv.Columns[5].Width = x*2;
}
10 голосов
/ 26 января 2011

Вот мое решение;

Вместо события resize я предпочитаю resizeEnd формы, чтобы код выполнялся только один раз после завершения изменения размера.

private void Form1_ResizeEnd(object sender, EventArgs e)
{
    this.ResizeColumnHeaders();
}

Функция ResizeColumnHeaders устанавливает все столбцы, кроме последнего, для соответствия содержимому столбца. В последнем столбце будет использоваться магическое значение, на которое намекает LexRema.

private void ResizeColumnHeaders()
{
    for (int i = 0; i < this.listView.Columns.Count - 1;i++ ) this.listView.AutoResizeColumn(i, ColumnHeaderAutoResizeStyle.ColumnContent);           
    this.listView.Columns[this.listView.Columns.Count - 1].Width = -2;
}

Также не забудьте вызвать ResizeColumnHeaders () после загрузки ваших начальных данных;

private void Form1_Load(object sender, EventArgs e)
{            
    this.LoadEntries();
    this.ResizeColumnHeaders();
}

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

public Form1()
{
    InitializeComponent();            
    this.listView.DoubleBuffer();            
}

DoubleBuffer () на самом деле расширение для легкого использования.

public static class ControlExtensions
{
    public static void DoubleBuffer(this Control control) 
    {
        // /48162/kak-udvoit-bufer-upravleniya-net-na-forme#48179
        // Taxes: Remote Desktop Connection and painting: http://blogs.msdn.com/oldnewthing/archive/2006/01/03/508694.aspx

        if (System.Windows.Forms.SystemInformation.TerminalServerSession) return;
        System.Reflection.PropertyInfo dbProp = typeof(System.Windows.Forms.Control).GetProperty("DoubleBuffered", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
        dbProp.SetValue(control, true, null);
    }
}
4 голосов
/ 17 мая 2015

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

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

Я не согласен с идеей реагировать на событие ResizeEnd вместо этого, как упоминалось в одном из других сообщений, так как это не выглядит красиво на экранеесли Windows настроена на рисование окон при перемещении и изменении размера.Вычисление быстрое, поэтому оно не создает проблем для постоянного изменения размера.

static private void ResizeAutoSizeColumn(ListView listView, int autoSizeColumnIndex)
{
  // Do some rudimentary (parameter) validation.
  if (listView == null) throw new ArgumentNullException("listView");
  if (listView.View != View.Details || listView.Columns.Count <= 0 || autoSizeColumnIndex < 0) return;
  if (autoSizeColumnIndex >= listView.Columns.Count)
    throw new IndexOutOfRangeException("Parameter autoSizeColumnIndex is outside the range of column indices in the ListView.");

  // Sum up the width of all columns except the auto-resizing one.
  int otherColumnsWidth = 0;
  foreach (ColumnHeader header in listView.Columns)
    if (header.Index != autoSizeColumnIndex)
      otherColumnsWidth += header.Width;

  // Calculate the (possibly) new width of the auto-resizable column.
  int autoSizeColumnWidth = listView.ClientRectangle.Width - otherColumnsWidth;

  // Finally set the new width of the auto-resizing column, if it has changed.
  if (listView.Columns[autoSizeColumnIndex].Width != autoSizeColumnWidth)
    listView.Columns[autoSizeColumnIndex].Width = autoSizeColumnWidth;
}
2 голосов
/ 26 января 2011

Вы можете изменить размер столбцов по содержимому, как описано здесь , или вам нужно прослушать событие Resize объекта ListView и установить размер столбцов во время выполнения.

0 голосов
/ 14 ноября 2014

используйте это

Private Sub ListView1_Resize(sender As Object, e As EventArgs) Handles ListView1.Resize
    Dim k = ListView1.Width - 10
    Dim i = k / 3
    ListView1.Columns(0).Width = k - i
    ListView1.Columns(1).Width = i / 2
    ListView1.Columns(2).Width = i / 2
End Sub

три колонки одна большая две меньших с тем же размером

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