Winforms 连接datagridview(winform)中2列的值

Winforms 连接datagridview(winform)中2列的值,winforms,datagridview,datagridviewcolumn,Winforms,Datagridview,Datagridviewcolumn,我有一个datagridview,它包含绑定列和未绑定列,我想组合2个所需绑定列(a和b)的值,因此列c(未绑定)包含来自a和b的值 可能吗 Nb:对不起,我不能发布照片来更好地解释 谢谢这可以通过不同的方式实现。最简单的方法可能是使用具有3列的DataTable,即a、b和c,其中c是一个以a+b为表达式的表达式 另一个选项是使用事件DataGridView。(您还可以使用一些其他事件,如CellFormatting) 示例-表达式列 var dt = new DataTable(); dt.

我有一个datagridview,它包含绑定列和未绑定列,我想组合2个所需绑定列(a和b)的值,因此列c(未绑定)包含来自a和b的值

可能吗

Nb:对不起,我不能发布照片来更好地解释


谢谢

这可以通过不同的方式实现。最简单的方法可能是使用具有3列的
DataTable
,即a、b和c,其中c是一个以a+b为表达式的表达式

另一个选项是使用事件
DataGridView
。(您还可以使用一些其他事件,如
CellFormatting

示例-表达式列

var dt = new DataTable();
dt.Columns.Add("A", typeof(int));
dt.Columns.Add("B", typeof(string));
dt.Columns.Add("C", typeof(string), "CONVERT(A, System.String) + B");
dt.Rows.Add(1, "One");
dt.Rows.Add(2, "Two");
dataGridView1.DataSource = dt;
示例-RowPrePaint

dataGridView1.Columns.Add("A", "A");
dataGridView1.Columns.Add("B", "B");
dataGridView1.Columns.Add("C", "C");
dataGridView1.Rows.Add(1, "One");
dataGridView1.Rows.Add(2, "Two");
dataGridView1.RowPrePaint += (s, a) =>
{
    if (a.RowIndex >= 0)
    {
        var g = (DataGridView)s;
        g["C", a.RowIndex].Value = $"{g["A", a.RowIndex].Value}{g["B", a.RowIndex].Value}";
    }
};

您可以在
CellFormatting
事件中根据需要为“c”列单元格生成值:

private void Grid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (e.RowIndex < 0) return;

    int cIndex = 2;
    if (e.ColumnIndex != cIndex) return;

    var grid = (DataGridView)sender;
    int aIndex = 0, bIndex = 1, row = e.RowIndex;

    e.Value = String.Format("{0} {1}", grid[aIndex, row].Value, grid[bIndex, row].Value);
    e.FormattingApplied = true;
}
private void Grid\u CellFormatting(对象发送方、DataGridViewCellFormattingEventArgs e)
{
如果(e.RowIndex<0)返回;
int-cIndex=2;
如果(e.ColumnIndex!=cIndex)返回;
var grid=(DataGridView)发送方;
intaindex=0,bIndex=1,row=e.RowIndex;
e、 Value=String.Format(“{0}{1}”,网格[aIndex,row].Value,网格[bIndex,row].Value);
e、 FormattingApplied=true;
}

这可以通过不同的方式实现。最简单的方法可能是使用
DataTable
,它有3列,a、b和c,其中c是一个表达式列,a+b作为表达式。我提到
CellFormatting
以及
RowPrePaint
的原因是,我更喜欢发布一个关于
RowPrePaint
的示例,因为如果更新前两列的值,第三列将不会立即更新,因为第三列不在剪辑绑定中,而
RowPrePaint
将始终升高。如果要对可编辑的
DataGridView
使用
CellFormatting
,则需要使格式化的单元格无效:
grid.InvalidateCell(grid[e.ColumnIndex,e.RowIndex])