2011-01-26 20 views
10

के साथ फिट करने के लिए ListView कॉलम समायोजित करें मेरे पास सूचीदृश्य कॉलम का चेहरा आकार बदलने का समस्या है। यदि आप एंकर/डॉकिंग सूचीदृश्य एंकर या डॉकिंग की तुलना में सामान्य Winform की सूचीदृश्य अच्छी तरह से काम करता है। मेरा मतलब है कि सूचीदृश्य आकार बदल जाएगा और Winforms के रूप में Winforms के रूप में फिट होगा, लेकिन जिन कॉलम पर आपने डिज़ाइन किया है, जो सूचीदृश्य के साथ आकार बदल नहीं है।WinForms

मेरा प्रश्न है: क्या 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); 


    } 

उत्तर

27
  1. Programatic एक। आपको इसे कोड में बनाए रखना होगा।
  2. आप अपने सूचीदृश्य में अंतिम कॉलम आकार समायोजित कर सकते हैं ताकि यह स्वचालित रूप से आकार बदल सके। नेट नमूना:

एक 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; 
} 

संपादित करें:

Programaticaly आप कर सकते हैं कि खुद को लागू किया एल्गोरिथ्म के साथ। समस्या यह है कि सूची दृश्य यह नहीं जानता कि आप किस कॉलम का आकार बदलना चाहते हैं और क्या नहीं। तो सभी कॉलम आकार परिवर्तन निर्दिष्ट करने के लिए आपके पास आकार बदलने की विधि (या 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, मैंने लिस्टव्यू डिज़ाइन के साथ अपना प्रश्न संपादित किया है। आपका कोड आकार बदलने की समस्या को हल करता है लेकिन शेष चार पिछले कॉलम और अंतिम कॉलम उनके बीच लंबी दूरी रखते हैं। – mahesh

+0

@LexRema, शेष चार पिछले कॉलम दूरी की समस्या को कैसे हल करें? – mahesh

+0

@LexRema, मैंने form1_Resize EventHandller पर मान पास किया है: int x = Listview.Width/15 और इसके बाद Listview1.columns [0] = x * 2; यह फिक्सिंग त्रुटि फेंकने की तरह है "संपत्ति indxercolumnheadercollection यह केवल पढ़ने योग्य है" – mahesh

2

जरूरत मूल्य के लिए प्रत्येक स्तंभ चौड़ाई सेट के रूप में वर्णित here आप सामग्री द्वारा कॉलम आकार बदल सकते हैं तो, या आप एक ListView का आकार घटना के लिए सुनने के लिए है और रनटाइम में कॉलम का आकार सेट करें।

9

मेरा समाधान यहां है;

इमेज का आकार बदलने के बजाय मैं आकार का आकार बदलना पसंद करता हूं, ताकि कोड केवल एक बार चलाया जा सके जब आकार पूर्ण हो जाए।

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

ResizeColumnHeaders समारोह पिछले एक स्तंभ-सामग्री के खिलाफ फिट करने के लिए छोड़कर सभी कॉलम सेट। अंतिम कॉलम लेक्सरेमा द्वारा संकेतित जादू-मूल्य का उपयोग करेगा।

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

डबलबफर() वास्तव में आसान उपयोग के लिए एक विस्तार है।

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

एक सरल समाधान है कि सूचीदृश्य और स्तंभ आप स्वचालित रूप से आकार बदलने के लिए चाहते हैं के सूचकांक लेता है के साथ छोटे, इसलिए कि पूरे सूचीदृश्य के क्लाइंट क्षेत्र का आकार अंतिम पिक्सेल में उपयोग किया जाता है, और अधिक नहीं, यानी कोई बदसूरत क्षैतिज स्क्रॉलबार दिखाई नहीं दे रहा है, भले ही आकार बदलने से नियंत्रण कम हो जाए।

आप अपने आकार ईवेंट हैंडलर से इस विधि कॉल करना चाहते हैं, और यह भी मामले में एक तत्व जोड़ने के बाद एक खड़ी स्क्रॉलबार अधिक लाइनों की तुलना में नियंत्रण खड़ी के लिए कमरा है जोड़ने के बाद दिखाई दिया।

मैं अन्य पोस्टों में से एक में उल्लेखित ResizeEnd ईवेंट पर प्रतिक्रिया करने के विचार से असहमत हूं, क्योंकि स्क्रीन पर यह अच्छा नहीं दिखता है कि विंडोज़ चलने और आकार बदलने के दौरान विंडोज़ खींचने के लिए सेट है। गणना त्वरित है, इसलिए यह लगातार आकार बदलने के लिए कोई समस्या नहीं पैदा करता है।

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