【问题标题】:c# datagridview column autosizemode时间:2019-04-10 标签:c#datagridviewcolumnautosizemode
【发布时间】:2013-06-03 22:47:59
【问题描述】:

我希望这些列默认使用

AutoSizeMode = DisplayedCells;

但我也希望可以调整列的大小,但DisplayedCells 类型不允许调整大小..

有什么想法吗?

【问题讨论】:

    标签: c# winforms datagridview autoresize datagridtemplatecolumn


    【解决方案1】:

    行:

    dataGridView1.AutoResizeRow(2, DataGridViewAutoSizeRowMode.AllCellsExceptHeader);
    

    栏目:

    dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    

    【讨论】:

    • 感谢@Gorfi,但与所有单元格相同,无法编辑大小
    【解决方案2】:

    我认为您无法实现这一点,因为一旦将 AutoSizeMode 设置为 DisplayedCells,所有行为都是由设计控制的。但我有这个想法。你应该保持你的专栏(我想 Columns[0] 用于演示目的)AutoSizeMode 固定在DataGridViewAutoSizeColumnMode.None。您希望将其设置为DisplayedCells,因为您可能希望根据单元格文本长度扩展或折叠列宽。所以我的想法是每次CellBeginEdit 启动时,我们将AutoSizeMode 设置为DisplayedCells,当CellEndEdit 启动时,我们保存宽度(为您自动调整大小),然后将AutoSizeMode 重置为None,然后将列 Width 分配给该保存的值。这是我的代码:

    //First before loading data
    private void form_Load(object sender, EventArgs e){
       dataGridView.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
       //Fill your dataGridView here
       //.........
       //.........
       int w = dataGridView.Columns[0].Width;
       //reset to None
       dataGridView.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
       dataGridView.Columns[0].Width = w;
    }
    //Now for CellBeginEdit and CellEndEdit
    private void dataGridView_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {
            if(e.ColumnIndex == 0) //because I suppose the interested column here is Columns[0]
               dataGridView.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
        }
    private void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if(e.ColumnIndex == 0){
              int w = dataGridView.Columns[0].Width;
              dataGridView.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
              dataGridView.Columns[0].Width = w;
            }
        }
    

    我测试了代码,它似乎工作正常,有一种情况它不会工作,因为我们没有为这种情况添加代码,即当 Cell 值被代码更改时。

    不得不说你想要的有点奇怪,我不太在意列的宽度,用户应该知道怎么处理。

    【讨论】:

      【解决方案3】:

      在我的一个应用程序中,我将 autosize 设置为显示单元格。然后,一旦加载了表单,我就会关闭自动调整大小以允许用户调整大小。

      private void Form1_Load(object sender, EventArgs e)
          {
      
              //  Designer has autosize set to displayedcells.
              dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;   // Turn off autosize
              dataGridView1.AllowUserToResizeRows = true;                                 // Turn on letting user size columns
              dataGridView1.AllowUserToOrderColumns = true;
          }
      

      【讨论】:

        【解决方案4】:

        您可以在方便的时候调用子DataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCells),例如在您加载数据之后。不理会DataGridView.AutoSizeColumnsMode 属性,用户仍然可以自己调整列的大小,但他们会有一个舒适的开始。两全其美。

        【讨论】:

        • 方法对我有用。唯一真正的问题是在调用AutoResizeColumns(int columnIndex, DataGridViewAutoSizeColumnsMode dataGridViewAutoSizeColumnsMode)之前需要在DataGridView上调用Refresh()
        【解决方案5】:

        在 Visual Studio 2008(和 VB.net)中唯一对我有用的是:

         For i As Integer = 0 To grdList2.Columns.Count - 1
          If i <> (grdList2.Columns.Count - 1) Then
           grdList2.Columns(i).AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
          Else
           grdList2.Columns(i).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
          End If
         Next
        

        【讨论】:

          猜你喜欢
          • 2016-04-19
          • 2022-01-16
          • 2018-07-04
          • 2019-06-02
          • 1970-01-01
          • 1970-01-01
          • 2013-05-26
          • 2015-02-10
          • 2018-09-10
          相关资源
          最近更新 更多