2011-01-26 3 views
10

У меня проблема изменения размера столбцов списка. Если вы используете якорь/док-станцию ​​, то список в обычном winform, чем якорь или док-станция для просмотра, хорошо работает. Я имею в виду, что listview будет изменять размер и приспосабливаться к winforms по мере того, как winforms максимизируется, но столбцы, которые вы создали на нем, который не изменяется с помощью listview.Отрегулируйте столбцы ListView в соответствии с WinForms

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

ListView Design Код:

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); 


    } 

ответ

27
  1. Programatic один. Вам нужно будет сохранить его в коде.
  2. Вы можете настроить размер последнего столбца в своем списке, чтобы он автоматически изменялся. Чистый образец:

В элементе управления ListView, с набором Посмотреть собственности на детали, вы можете создать вывод из нескольких столбцов. Иногда вам понадобится последний столбец списка 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; 
} 

EDIT:

Programaticaly вы можете сделать это с помощью собственного реализованного алгоритма. Проблема в том, что представление списка не знает, что из столбцов вы хотите изменить размер, а что нет. Таким образом, вы будете иметь метод 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; 
} 
+0

@LexRema, я отредактировал свой вопрос в Listview Design. Ваш код сортирует проблему изменения размера, но остальные четыре предыдущих столбца и последние столбцы хранят большое расстояние между ними. – mahesh

+0

@LexRema, Как решить остальную часть четырех предыдущих проблем с расстоянием столбцов ?. – mahesh

+0

@LexRema, я передал значение в form1_Resize EventHandller: int x = Listview.Width/15 и более поздним, чем Listview1.columns [0] = x * 2; это ошибка компиляции throw Как «свойство indxercolumnheadercollection это только для чтения» что-то вроде – mahesh

2

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

9

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

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

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(); 
} 

Еще одна вещь, чтобы предотвратить мерцание, а колонны-изменение размера, вам нужно дважды буфер ListView.

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

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

public static class ControlExtensions 
{ 
    public static void DoubleBuffer(this Control control) 
    { 
     // http://stackoverflow.com/questions/76993/how-to-double-buffer-net-controls-on-a-form/77233#77233 
     // 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); 
    } 
} 
+0

Я думаю, что для вашего кода требуется другое пространство имен, не так ли? – mahesh

+0

, в какой части вы говорите? возможно, о расширении двойного буфера? – HuseyinUslu

+0

Да Вы правы? – mahesh

0

использовать этот

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 

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

2

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

Вы хотите вызвать этот метод из вашего 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; 
} 
Смежные вопросы