2016-07-29 9 views
1

Diese Frage wurde an anderer Stelle nicht gestellt, da die Schriftart geändert wurde. Und andere Antworten haben eine Lösung, die nach einer Schriftartänderung nicht funktioniert.Minimale Datagridview-Breite nach Änderung der Schriftart nicht möglich

Mit der Schaltfläche für die feste Breite wird die Breite der Datagridview festgelegt, sodass keine Bildlaufleisten angezeigt werden.

Wenn ich auf Zeile hinzufügen klicken, dann Breite, dann Schriftart ändern und Breite dann fix, dann funktioniert die Breite nicht. Also, sie zu beschriften A, B, C, D

A) in Reihe < - WERKE
B) fixieren Breite < --- WORKS
C) Schrift ändern < --- WORKS
D) fixieren width, < --- FAILS

Fixbreite funktioniert auf Zeile B, schlägt aber auf Zeile D fehl, dh schlägt nach dem Zeichensatzwechsel fehl.

Ich habe eine alternative Methode, um die minimale Breite zu bekommen, die ich eingeschlossen habe, aber keiner von ihnen funktioniert .. So wird die Breite nicht richtig eingestellt.

enter image description here

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace dgvblah1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 


      dataGridView1.AllowUserToAddRows = false; // maybe doesn't make a difference here for some reaosn. 

      dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; 
      dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; 

      dataGridView1.Columns.Add("Col1", "Col1"); 
       dataGridView1.Rows.Add(1); 

      /* 
      btnaddrow.PerformClick(); 
      btnchangefont.PerformClick(); 
      btnaddrow.PerformClick(); 
      btnfixwidth.PerformClick(); //fail 
      */ 

     } 

     private int seeifworks_get_min_dgv_width_A(DataGridView dgv) 
     { 
      // it's not too bad, it sometimes makes it the correct width and sometimes not quite enough, and so it's worth then running the next method that increments the width until there are no more horizontal scroll bars. 

      int padding = 2; // clearly wrong here, it seems 
      int tw = dgv.Columns.GetColumnsWidth(DataGridViewElementStates.None) + dgv.RowHeadersWidth + padding + 2; 
      int th = dgv.Rows.GetRowsHeight(DataGridViewElementStates.None) + dgv.ColumnHeadersHeight; 

      return tw; 
     } 

     private int seeifworks_get_min_dgv_width_B(DataGridView dgv) 
     { 
      // http://stackoverflow.com/questions/6651487/programmatically-resize-datagridview-to-remove-scroll-bars 
      // Add two pixels for the border for BorderStyles other than None. 
      var controlBorderWidth = (dgv.BorderStyle == BorderStyle.None) ? 0 : 2; 

      // Return the width of all columns plus the row header, and adjusted for the DGV's BorderStyle. 
      return dgv.Columns.GetColumnsWidth(DataGridViewElementStates.Visible) + dgv.RowHeadersWidth + controlBorderWidth; 

     } 


     private void btnfixwidth_Click(object sender, EventArgs e) 
     { 
      // dataGridView1.Width = seeifworks_get_min_dgv_width_A(dataGridView1); 

      dataGridView1.Width = seeifworks_get_min_dgv_width_B(dataGridView1); 


     } 

     private void btnaddrow_Click(object sender, EventArgs e) 
     { 
      dataGridView1.Rows.Add(1); 
     } 

     private void btnchangefont_Click(object sender, EventArgs e) 
     { 
      dataGridView1.ColumnHeadersDefaultCellStyle.Font = new System.Drawing.Font("Courier New", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 

      for (int i = 0; i < dataGridView1.Rows.Count; i++) 
       dataGridView1.Rows[i].DefaultCellStyle.Font = new Font("Courier New", 30, FontStyle.Bold); 

      dataGridView1.ColumnHeadersDefaultCellStyle.Font = new System.Drawing.Font("Courier New", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 

     } 
    } 
} 

Antwort

1

Wenn die vertikale scollbar ist das Verfahren nicht sichtbar funktioniert, aber wenn durch fond ändern und Hinzufügen von Zeilen vertikale Bildlaufleiste bekam sichtbar, sollten Sie auch die Breite der Scrollbar berechnet Breite der Spalten hinzufügen . Hier ist eine bessere Version des Verfahrens, die bevorzugte Breite von DataGridView berechnet:

private int GetPreferredWidth(DataGridView grid) 
{ 
    var border = 0; 
    if (grid.BorderStyle == BorderStyle.FixedSingle) 
     border = 2 * SystemInformation.BorderSize.Width; 
    var vscrollWidth = 0; 
    var vscroll = dataGridView1.Controls.OfType<VScrollBar>().FirstOrDefault(); 
    if (vscroll != null && vscroll.Visible) 
     border += vscroll.Width; 
    var columnsWidth = grid.Columns.GetColumnsWidth(DataGridViewElementStates.Visible); 
    var rowHeadersWidth = 0; 
    if (grid.RowHeadersVisible) 
     rowHeadersWidth = grid.RowHeadersWidth; 
    return columnsWidth + vscrollWidth + rowHeadersWidth + border; 
} 

Auch grid.GetPreferredSize(new Size(0, 0)).Width; ist eine gute Option, aber es fügt einige zusätzliche Breite. Wenn Sie diese zusätzliche Breite, diese zusätzliche Größe nicht stören, können Sie die GetPreferredSize Methode.

+0

danke, ich werde das versuchen, ich bin gespannt, wie Sie herausgefunden haben, dass es die Größe der vertikalen Bildlaufleiste war? – barlop

+0

Es ist keine Vermutung, ich habe Ihren Code getestet, es hat richtig funktioniert. Wenn die vertikale Bildlaufleiste jedoch wegen der Anzahl der Zeilen oder der großen Schriftart angezeigt wurde, funktionierte Ihre Methode nicht ordnungsgemäß. Ich habe es in obige Methode geändert und jetzt funktioniert es auch richtig, wenn ich eine vertikale Bildlaufleiste habe. –

+0

groß .. übrigens du verpasst rowheaderswidth (das ist die seltsame Spalte wie etwas vor der ersten Spalte), ich habe nur hinzugefügt. Und Sie haben das 'n' in Spalten verpasst, also habe ich diesen Rechtschreibfehler korrigiert. – barlop

Verwandte Themen