将列表绑定到datagridview时修复列宽

时间:2010-03-17 20:47:16

标签: c# data-binding datagridview

我有一个列表,我已绑定到datagridview。我希望第一列是固定大小。数据绑定到dataGridView,我似乎无法找到访问单个colums属性的方法。如果我尝试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;
    }

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

编辑原始代码,以显示仍然有效的清理版本

3 个答案:

答案 0 :(得分:1)

myDatagridview.colums[0] 

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

我不想在Headers中使用自动调整大小。

答案 1 :(得分:1)

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

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

以下是一些片段....

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

- 网格def:

        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;
            }
        }
    }

答案 2 :(得分:0)

使用你的代码,我发现了一些有用的东西。

我从创建线程中分离了列大小更改,我怀疑它是在窗体的构造函数中调用的。

相反,我把它放在表单的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;
                    }
                }));
            }
        }