Свойство Winform DataGridViewLinkColumn ReadOnly не работает

По моему VS2015 Winform приложение, есть один DataGridView контроль связан с BindingSource это связано с базой данных SQL. Сетка имеет четыре столбца: ID, URL, Имя, Тип. Столбец URL DataGridViewLinkColumn чья ReadOnly свойство по умолчанию имеет значение False, Я могу редактировать столбцы Имя и Тип, но столбцы URL отображаются как ReadOnly. Зачем? Как я могу сделать колонку URL редактируемой?

1 ответ

Как сказал Реза:

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 введите успешно. Но при преобразовании обратно в ячейки ссылок отладка показала, что преобразование произошло, но форматирование и поведение ячеек не удалось.

Другие вопросы по тегам