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