Winform DataGridViewLinkColumn ReadOnly属性不起作用

时间:2016-03-17 23:11:56

标签: winforms datagridview bindingsource datagridviewlinkcolumn

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

1 个答案:

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