【问题标题】:DataGridView AutoFit and FillDataGridView 自动调整和填充
【发布时间】:2013-09-11 01:46:16
【问题描述】:

我的DataGridView 中有 3 列。我想要做的是让前 2 列自动适应内容的宽度,并让第 3 列填充剩余空间。

是否可以在 WinForms 中进行?如果有任何用处,我将从 EF DataContext 加载我的数据。我已经附上了它当前外观的图片。

【问题讨论】:

    标签: c# winforms datagridview


    【解决方案1】:

    您需要使用DataGridViewColumn.AutoSizeMode 属性。

    您可以对第 0 列和第 1 列使用以下值之一:

    AllCells: 调整列宽以适合所有单元格的内容 列,包括标题单元格。
    AllCellsExceptHeader: 调整列宽以适应列中所有单元格的内容,不包括标题单元格。
    DisplayedCells: 列宽调整为 适合当前在行中的列中所有单元格的内容 显示在屏幕上,包括标题单元格。
    DisplayedCellsExceptHeader: 调整列宽以适应 当前在行中的列中所有单元格的内容 显示在屏幕上,不包括标题单元格。

    然后你对第 2 列使用 Fill

    调整列宽,使所有列的宽度完全填满控件的显示区域...

    this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
    this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
    this.DataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    

    正如其他用户所指出的,可以使用DataGridView.AutoSizeColumnsMode 属性将默认值设置为datagridview 级别。

    this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
    this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
    

    可能是:

    this.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
    

    重要提示:

    如果您的网格绑定到数据源并且列是自动生成的(AutoGenerateColumns 属性设置为 True),您需要使用 DataBindingComplete 事件来应用样式AFTER列创建的。


    在某些情况下(例如通过代码更改单元格值),我必须调用 DataGridView1.AutoResizeColumns(); 来刷新网格。

    【讨论】:

    • 在使用 DataBindingComplete 事件时完美运行。
    • 我不知道如何在填充数据网格后调用 DataBindingComplete 方法
    • @Dan DataBindingComplete 不是一个方法,它是一个你需要订阅的datagridview event。这个答案stackoverflow.com/a/31685874/2387010 给出了一个例子。有帮助吗?
    • 如果解释了这个例子会很有帮助,但也足够了。 MSDN article that you linked to in your post 将其显示为一种方法,这是我用作我的模式但无法弄清楚它是如何被调用的。
    • @Chris 丢失的信息绝对有帮助,谢谢。我正在阅读this book 并且刚刚 读到了关于委托和 lambda 函数的章节,所以希望这会很快变得更有意义。谢谢!
    【解决方案2】:

    这是我最喜欢的方法...

    _dataGrid.DataBindingComplete += (o, _) =>
        {
            var dataGridView = o as DataGridView;
            if (dataGridView != null)
            {
               dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
               dataGridView.Columns[dataGridView.ColumnCount-1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            }
        };
    

    【讨论】:

    • 如果列大小 =0,index out of bound exception 只需修复它,谢谢!!
    【解决方案3】:

    只需从控制属性更改属性: AutoSizeColumnsMode:Fill

    或按代码

    dataGridView1.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;

    【讨论】:

    • 谢谢。我一直在寻找这样的解决方案! :)
    【解决方案4】:

    未测试,但您可以试一试。 已测试且工作正常。我希望你可以和AutoSizeModeDataGridViewColum 一起玩来实现你所需要的。

    尝试设置

    dataGridView1.DataSource = yourdatasource;<--set datasource before you set AutoSizeMode
    
    //Set the following properties after setting datasource
    dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    dataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    dataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    

    这应该可以工作

    【讨论】:

    • 这不起作用。我在从 DataContext 添加数据源之前初始化表单时设置它。这可能是为什么?我不确定在哪里设置它,因为数据是在运行时加载的,并且列是从 EF 模型中获取的。
    • 貌似是这样,但不是,第三行不行,我10分钟前测试过。
    • @JamesJeffery 你是自动填充列还是手动填充?
    • @SriramSakthivel 我正在使用 dataGridView1.DataSource 属性绑定从我的 DataContext 返回的列表。
    【解决方案5】:

    尝试做,

     AutoSizeColumnMode = Fill;
    

    【讨论】:

      【解决方案6】:
      public static void Fill(DataGridView dgv2)
         {
              try
              {
                  dgv = dgv2;
                  foreach (DataGridViewColumn GridCol in dgv.Columns)
                  {
                      for (int j = 0; j < GridCol.DataGridView.ColumnCount; j++)
                      {
                          GridCol.DataGridView.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                          GridCol.DataGridView.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                          GridCol.DataGridView.Columns[j].FillWeight = 1;
                      }
                  }
              }
              catch (Exception ex)
              {
                  MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
              }
          }
      

      【讨论】:

      • 这段代码不是很好。首先,您不需要嵌套循环,它将所有列的宽度模式设置为多次()次;您可以直接从GridCol 访问每列的 AutoSizeMode 和 FillWeight 属性。其次,它将每列的 AutoSizeMode 设置为两个不同的值;第二个分配将覆盖第一个。
      【解决方案7】:

      以 AlfredBr 的回答为基础,如果您隐藏了一些列,您可以使用以下方法自动调整所有列的大小,然后让最后一个可见列填充空白区域:

      myDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
      myDgv.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.None).AutoSizeMode = 
          DataGridViewAutoSizeColumnMode.Fill;
      

      【讨论】:

        【解决方案8】:

        这是我所做的,以便在所有列都无法做到这一点时让“first_name”列填充空间。

        当网格变小时,“first_name”列几乎不可见(非常薄),因此我可以将DataGridViewAutoSizeColumnMode 属性设置为AllCells,作为其他可见列。对于性能问题,重要的是在数据绑定之前将它们设置为None,并在网格的DataBindingComplete 事件处理程序中设置回AllCells。希望对您有所帮助!

        private void dataGridView1_Resize(object sender, EventArgs e)
        {
            int ColumnsWidth = 0;
            foreach(DataGridViewColumn col in dataGridView1.Columns)
            {
                if (col.Visible) ColumnsWidth += col.Width;
            }
            if (ColumnsWidth <dataGridView1.Width)
            {
                dataGridView1.Columns["first_name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            }
            else if (dataGridView1.Columns["first_name"].Width < 10) 
            {
                dataGridView1.Columns["first_name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            }
        }
        

        【讨论】:

          【解决方案9】:
          public void setHeight(DataGridView src)
          {
              src.Height= src.ColumnHeadersVisible ? src.ColumnHeadersHeight : 0 +   src.Rows.OfType<DataGridViewRow>().Where(row => row.Visible).Sum(row => row.Height);
          }
          

          【讨论】:

          • 只需调用该函数,它会根据其中的行数来决定datagridview的高度
          • 首先,这并没有回答 OP 的问题。此外(供将来参考)包括对答案本身的此类评论(您可以对其进行编辑)。
          【解决方案10】:

          试试这个:

            DGV.AutoResizeColumns();
            DGV.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.AllCells;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-10-31
            • 2014-06-07
            • 1970-01-01
            • 2021-02-13
            • 1970-01-01
            • 2016-12-12
            相关资源
            最近更新 更多