在第一列中显示第二列的值(如果第一列为空,则作为备用)

时间:2019-08-29 07:03:42

标签: c# .net winforms datagridview

所以我有这个DataGridView,其中有两列,分别为“ Phone1 ”和“ Phone2 ”。

问题是当Phone1为空时,可能是Phone2中有一个电话号码。如何在C#中检查Phone1是否为空,但是如果Phone2不为空,那么Phone2中的文本将转到Phone1?

假设以下输入,Phone1在第二和第三行中没有值:

┌───────────┬───────────┐
│ Phone1    │ Phone2    │
├───────────┼───────────┤
│ 1111111   │ 2222222   │
│           │ 3333333   │
│           │ 4444444   │
│ 5555555   │           │
└───────────┴───────────┘

这是预期的输出,Phone2的值已显示为后备:

┌───────────┬───────────┐
│ Phone1    │ Phone2    │
├───────────┼───────────┤
│ 1111111   │ 2222222   │
│ 3333333   │ 3333333   │
│ 4444444   │ 4444444   │
│ 5555555   │           │
└───────────┴───────────┘

那么,如果第一列为空,我可以在第一列中显示第二列的值作为后备吗?

2 个答案:

答案 0 :(得分:2)

如果这是winforms,则在DataGridView的行中循环,如下所示:

编辑:根据Uwe Keim DBNull.Value也应检查。

for(int i = 0; i< DataGridView.Rows.Count; i++)
{
    DataGridViewCell colPhone1 = DataGridView.Rows[i].Cells["Phone1"];
    DataGridViewCell colPhone2 = DataGridView.Rows[i].Cells["Phone2"];
    if(colPhone1.Value == null || colPhone1.Value == DBNull.Value)
    {
        colPhone1.Value = colPhone2.Value;

    }
    else if(colPhone2.Value == null || colPhone2.Value == DBNull.Value)
    {
        colPhone2.Value = colPhone1.Value;
    }
}

答案 1 :(得分:0)

一般的解决方案是将CellFormatting用于此类要求。在事件处理程序中,您可以设置e.Value或为单元格设置样式。

这里有一个例子:

DataTable dt;
private void Form1_Load(object sender, EventArgs e)
{
    dt = new DataTable();
    dt.Columns.Add("Phone1");
    dt.Columns.Add("Phone2");
    dt.Rows.Add("123", "456");
    dt.Rows.Add(DBNull.Value, "789");
    dataGridView1.CellFormatting += DataGridView1_CellFormatting;
    dataGridView1.CellEndEdit += DataGridView1_CellEndEdit;
    dataGridView1.DataSource = dt;
}
private void DataGridView1_CellEndEdit(object sender, 
    DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == 1 && e.RowIndex >= 0)
        dataGridView1.InvalidateCell(0, e.RowIndex);
}
private void DataGridView1_CellFormatting(object sender, 
    DataGridViewCellFormattingEventArgs e)
{
    if (e.ColumnIndex == 0 && e.RowIndex >= 0)
    {
        if (e.Value == DBNull.Value)
        {
            var otherValue = dataGridView1.Rows[e.RowIndex].Cells[1].Value;
            if (otherValue != DBNull.Value)
            {
                //If you want just display value of the other cell
                e.Value = otherValue;

                // If you want display and push value of other cell into this cell
                //((DataRowView)dataGridView1.Rows[e.RowIndex]
                //       .DataBoundItem)[e.ColumnIndex] = otherValue;
            }
        }
    }
}