所以我有这个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 │ │
└───────────┴───────────┘
那么,如果第一列为空,我可以在第一列中显示第二列的值作为后备吗?
答案 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;
}
}
}
}