【问题标题】:DataGridView Autosize but restrict max column sizeDataGridView 自动调整大小但限制最大列大小
【发布时间】:2019-02-18 22:19:48
【问题描述】:

在我的 C# 4.0 应用程序中,我有一个 DataGridView 来显示一些数据。我希望列大小与内容相应,因此我将 AutoSizeColumnsMode 设置为 AllCellsExceptHeader。但我想限制列增长超过某个值。有一个 MinimumWidth 属性...但不幸的是没有 MaximumWidth 属性。

有什么办法解决这个问题吗?

提前致谢, 弗兰克

【问题讨论】:

    标签: c# datagridview


    【解决方案1】:

    我设法做到这一点的唯一方法是在向其添加行后检查列宽,检查宽度,如果它的大小高于我的最大值,我在将列 AutoSizeMode 更改为 DataGridViewAutoSizeColumnMode.None 后手动设置它

          foreach(DataGridViewColumn c in myView.Columns)
                if (c.Width > myMax)
                {
                    c.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
                    c.Width = myMax;
                }
    

    当然,当您添加/更新/删除行并再次执行该过程时,您需要再次将 AutoSizeColumnsMode 设置为 AllCellsExceptHeader。

    【讨论】:

      【解决方案2】:

      我知道这是一个较老的问题,但我自己也遇到过,并得到了一个不错的(我猜是的)解决方案;

      ' Eventhandler 
      Private Sub DataGridView1_ColumnWidthChanged(sender As Object, e As DataGridViewColumnEventArgs)
      
      // If my Grid refreshes this event doesnt work properly so I stop it from firing
          If isRefreshing Then Exit Sub
      
          Dim col As DataGridViewColumn = e.Column
          If col.AutoSizeMode = DataGridViewAutoSizeColumnMode.None Then //optional
              Dim isWidth As Integer = col.Width
              Dim prefWidth As Integer = col.GetPreferredWidth(DataGridViewAutoSizeColumnMode.AllCellsExceptHeader, True)
              If isWidth > prefWidth Then col.Width = prefWidth
          End If
      End Sub
      

      在这种情况下,我的 MaxWidth 是首选宽度。您可以将 prefWidth 更改为您想要的任何最大值。

      【讨论】:

      • 刚刚注意到这是一个带有 vb.net 答案的 c# 问题,抱歉。但是你应该能够翻译那个。 :-)
      • 翻译得很好。旁注,在 C# 中,更改列宽会触发此事件。如果您不希望在设置col.Width = prefWidth 时花费额外的计算时间检查和重新检查列,那么在设置的代码开头包含第二个标志是明智的。我不知道这种行为在 VB.net 中是否相同。
      【解决方案3】:

      我的版本是

      private const int GridAutoResizeBoundary = 100;
      private const int MaxColumnWidth = 300;
      
      public static void AutoSizeColumns(this DataGridView dataGridView)
      {
          if (dataGridView.RowCount <= GridAutoResizeBoundary)
              dataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
          else
              dataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCells);
      
          foreach (DataGridViewColumn column in dataGridView.Columns)
          {
              if (column.Width > MaxColumnWidth)
                  column.Width = MaxColumnWidth;
          }
      }
      

      【讨论】:

      • 这改变了整个datagridview的AutoResizeMode,你不想这样。
      猜你喜欢
      • 1970-01-01
      • 2011-08-22
      • 2012-11-12
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多