在我的VS2015 Winform
应用中,有一个DataGridView
控件绑定到绑定到SQL数据库的BindingSource
。 Grid有四列:ID,URL,Name,Type。 URL列为DataGridViewLinkColumn
,默认情况下,ReadOnly
属性设置为False
。我可以编辑Name和Type列,但URL列显示为ReadOnly。为什么?如何使URL列可编辑?
答案 0 :(得分:0)
正如Reza所说:
DataGridViewLinkColumn
无法修改。
因此,要编辑此类列中的单元格,您必须根据需要将其转换为DataGridViewTextBoxCell
。例如,如果我订阅DataGridView.CellContentClick
来处理点击链接,那么我会处理CellDoubleClick
进行单元格转换:
private void DataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
if (this.dataGridView1.Columns[e.ColumnIndex] == this.dataGridView1.Columns["URL"])
{
this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex] = new DataGridViewTextBoxCell();
this.dataGridView1.BeginEdit(true);
}
}
输入值并离开单元格后,您应该使用CellValidated
验证新值是否为URI,然后再将单元格转换回DataGridViewLinkCell
:
private void DataGridView1_CellValidated(object sender, DataGridViewCellEventArgs e)
{
if (this.dataGridView1.Columns[e.ColumnIndex] == this.dataGridView1.Columns["URL"])
{
DataGridViewCell cell = this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
if (Uri.IsWellFormedUriString(cell.EditedFormattedValue.ToString(), UriKind.Absolute))
{
cell = new DataGridViewLinkCell();
}
}
}
警告:
这只适用于“URL”列的数据是字符串,因此在绑定后,该列默认为DataGridViewTextBoxColumn
- 强制手动转换为链接单元格开头:< / p>
private void DataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
foreach (DataGridViewRow r in dataGridView1.Rows)
{
if (Uri.IsWellFormedUriString(r.Cells["URL"].Value.ToString(), UriKind.Absolute))
{
r.Cells["URL"] = new DataGridViewLinkCell();
}
}
}
从一开始就将“URI”列设置为DataGridViewLinkColumn
,可以成功将单元格转换为TextBox
类型。但是当转换回链接单元格时,调试显示转换发生,但单元格格式和行为失败。