2

这看起来很简单,但它正在成为我非常沮丧的根源。我正在创建一个 DataGridView 并将其 DataSource 设置为一个包含两个属性的对象列表......一个 int 和一个按钮。第一列工作正常,但第二列是空白的。在 SO 搜索之后,我意识到我的问题可能是我的按钮列需要设置为 DataGridViewButtonColumn,只有当我尝试将其设置为这样时,它才会创建一个新的第三个按钮列。

如何将自动生成的列关联为 DataGridViewButtonColumn?这是我的代码的简化版本。

List<EditGrid> items = new List<EditGrid>();

foreach (int number in numbers)
{
    EditGrid eg = new EditGrid();

    eg.number = number;
    eg.edit = new Button() { Text = "Edit", Name = "Edit" };

    items.Add(eg);
}

DataGridView d = new DataGridView
{
    Dock = DockStyle.Fill,
    AutoGenerateColumns = true,
    DataSource = items
};

Controls.Add(d);
4

2 回答 2

2

我认为您必须使用一些自定义CellPainting并且不要将Textof设置DataGridViewButtonColumn为任何内容(默认情况下这是一个空字符串)。像这样:

private void dataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
        if (e.ColumnIndex > -1&&e.RowIndex > -1&&dataGridView.Columns[e.ColumnIndex] is DataGridViewButtonColumn)
        {                
            if (e.Value == null) return;
            e.Handled = true;
            e.PaintBackground(e.CellBounds, true);
            e.PaintContent(e.CellBounds);
            //prepare format for drawing string yourself.
            StringFormat sf = new StringFormat() { LineAlignment = StringAlignment.Center, Alignment = StringAlignment.Center };
            e.Graphics.DrawString(((Button)e.Value).Text, dataGridView.Font, Brushes.Black, e.CellBounds, sf);                
        }
}

在您的情况下替换dataGridViewd, 看起来您使用代码创建了 DataGridView,如果是这样,您必须自己注册CellPainting事件处理程序,如下所示:

d.CellPainting += dataGridView_CellPainting;

更新

要使您的 DataGridView 首先有一个 DataGridViewButtonColumn(无需在设计时添加),您必须在设置 DataGridView 的 DataSource 之前添加此代码:

DataGridViewButtonColumn col = new DataGridViewButtonColumn();
col.HeaderText = "Your header";
col.Name = "button";
col.DataPropertyName = "Your DataSource Data member";//This is very important to match the corresponding Property or DataMember name of your DataSource.
col.FlatStyle = FlatStyle.Popup;//I suggest this because it looks more elegant.
d.Columns.Add(col);         
//----
d.DataSource = ...   

我发现DisplayIndex为您的 Button 列设置 不起作用,相反,您可能希望在DisplayIndex之后设置它d.DataSource=...,并且它可以工作:

d.DataSource = ...   ;
d.Columns["button"].DisplayIndex = ...;
于 2013-06-13T14:29:04.630 回答
0
    var buttonCol = new DataGridViewButtonColumn();
    buttonCol.Name = "ButtonColumnName";
    buttonCol.HeaderText = "Header";
    buttonCol.Text = "Button Text";

    dataGridView.Columns.Add(buttonCol);
    foreach (DataGridViewRow row in dataGridView.Rows)
{
    DataGridViewButtonCell button = (row.Cells["ButtonColumnName"] as DataGridViewButtonCell);        
}
于 2013-06-13T14:00:25.767 回答