【问题标题】:fix a columns width when a list is bound to a datagridview当列表绑定到 datagridview 时修复列宽
【发布时间】:2010-03-17 20:47:16
【问题描述】:

我有一个绑定到 datagridview 的列表。我希望第一列是固定大小。数据绑定到 dataGridView,我似乎无法找到访问单个列属性的方法。如果我尝试 myDatagridview.colums[0] 我得到一个超出范围的索引,因为它说列数是 0。

   private DataGridView setUpDataGrid(List<NVRlineVal> _NVRData)
    {
        //setup dataGridView
        DataGridView NVRDataGridView = new System.Windows.Forms.DataGridView();
        NVRDataGridView.ColumnHeadersHeightSizeMode =
            System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
        NVRDataGridView.Dock = System.Windows.Forms.DockStyle.Fill;
        NVRDataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;


        NVRDataGridView.Name = "NVRDataGridView" + nvrIndex;
        NVRDataGridView.RowHeadersWidthSizeMode =
            System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders;
        NVRDataGridView.TabIndex = 0;
        NVRDataGridView.DataSource = _NVRData;
        //var clmn = NVRDataGridView.Columns[0];

        return NVRDataGridView;
    }

关于如何只为其中一列设置固定列宽,其余列将自动调整大小的任何想法?

编辑了原始代码,以显示仍然有效的更干净的版本

【问题讨论】:

  • 我删除了那些行,它仍然可以工作,那些只是我试图弄清楚如何停靠它时留下的。

标签: c# data-binding datagridview


【解决方案1】:

我做了类似的事情,但有格式。

问题是设置数据源后没有绘制网格-您需要在DataBindingComplete事件中进行更改。

这里有一些 sn-ps....

(来自https://minisqlquery.svn.codeplex.com/svn/trunk/MiniSqlQuery/QueryForm.cs

-- 网格定义:

        this.gridResults1.AllowUserToAddRows = false;
        this.gridResults1.AllowUserToDeleteRows = false;
        this.gridResults1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.ColumnHeader;
        this.gridResults1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
        this.gridResults1.Dock = System.Windows.Forms.DockStyle.Fill;
        this.gridResults1.Location = new System.Drawing.Point(3, 3);
        this.gridResults1.Name = "gridResults1";
        this.gridResults1.ReadOnly = true;
        this.gridResults1.Size = new System.Drawing.Size(1023, 242);
        this.gridResults1.TabIndex = 0;

--稍后订阅DataBindingComplete事件:

grid.DataBindingComplete += GridDataBindingComplete;

-- 处理事件(这里我是在修改格式但是你尝试改变宽度):

    private void GridDataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
    {
        DataGridView grid = sender as DataGridView;
        if (grid == null)
        {
            return;
        }
        DataTable dt = grid.DataSource as DataTable;
        if (dt == null)
        {
            return;
        }

        string nullText = _settings.NullText;
        string dateTimeFormat = _settings.DateTimeFormat;

        for (int i = 0; i < dt.Columns.Count; i++)
        {
            if (dt.Columns[i].DataType == typeof (DateTime))
            {
                DataGridViewCellStyle dateCellStyle = new DataGridViewCellStyle();
                dateCellStyle.NullValue = nullText;
                dateCellStyle.Format = dateTimeFormat;
                grid.Columns[i].DefaultCellStyle = dateCellStyle;
            }
        }
    }

【讨论】:

  • 谢谢,我刚刚在绑定后将我的东西添加到了事件处理程序中,它起作用了。
  • 甜蜜!我实际上需要添加一个类似的调整,以便自动调整大小的列不会变得太大,谢谢你提醒我! PK :-)
【解决方案2】:
myDatagridview.colums[0] 

只要在绑定数据后使用它就可以了。当我做这样的事情时,我在完成所有关于数据的代码后设置列的宽度。

我不想在这两个标题中都使用自动调整大小。

【讨论】:

  • 即使我在行后使用它也对我不起作用:NVRDataGridView.DataSource = _NVRData;
  • 尝试不使用NVRDataGridView.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders;
  • 在我取出你提到的那行之后,我在数据绑定之后尝试了这个,我得到了一个超出范围的异常:var clmn = NVRDataGridView.Columns[0];
  • 我猜你是对的,但我认为设置数据源会绑定数据,但实际上稍后会发生这种情况。所以我只是像保罗提到的那样设置了一个事件处理程序并在那里处理它。
【解决方案3】:

使用您的代码,我发现了一些可行的方法。

我将列大小更改与我怀疑在表单的构造函数中调用的创建线程分开。

相反,我将它放在表单的 VisibleChanged 事件中。

它对我有用。请注意,为此您必须放置声明:

DataGridView NVRDataGridView

在表单级别供其他方法访问,但您可以将初始化留在更新方法中。

private void Form1_VisibleChanged(object sender, EventArgs e)
        {
            if (this.Visible)
            {
                this.Invoke(new EventHandler(delegate
                {
                    if (NVRDataGridView.ColumnCount > 0)
                    {
                        NVRDataGridView.Columns[0].Width = 20;
                    }
                }));
            }
        }

【讨论】:

  • 谢谢,我正准备出门,但我会在早上第一件事尝试一下。将报告结果
猜你喜欢
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 2011-05-07
  • 1970-01-01
  • 2014-08-18
相关资源
最近更新 更多