Winforms Winform DataGridViewLinkColumn只读属性不工作

Winforms Winform DataGridViewLinkColumn只读属性不工作,winforms,datagridview,bindingsource,datagridviewlinkcolumn,Winforms,Datagridview,Bindingsource,Datagridviewlinkcolumn,在我的VS2015Winform应用程序中,有一个DataGridView控件绑定到绑定到SQL数据库的BindingSource。网格有四列:ID、URL、Name和Type。URL列为DataGridViewLinkColumn,默认情况下,其只读属性设置为False。我可以编辑名称和类型列,但URL列显示为只读。为什么?如何使URL列可编辑?如Reza所述: DataGridViewLinkColumn不可编辑 因此,要编辑此类列中的单元格,必须根据需要将其转换为DataGridViewT

在我的VS2015
Winform
应用程序中,有一个
DataGridView
控件绑定到绑定到SQL数据库的
BindingSource
。网格有四列:ID、URL、Name和Type。URL列为
DataGridViewLinkColumn
,默认情况下,其
只读属性设置为
False
。我可以编辑名称和类型列,但URL列显示为只读。为什么?如何使URL列可编辑?

如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
    ——强制手动转换为链接单元格:

    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
    类型。但当转换回链接单元格时,调试显示转换已发生,但单元格格式和行为失败


DataGridViewLinkColumn
不可编辑。它只是以链接的形式显示内容。数据实际上是在数据库(读写)中更改的,还是仅在表单上更改的(可能仍然是只读的,只是在“戏弄”你)?