2016-01-16 2 views
1

Я пытаюсь выяснить, как установить ячейку в dataGridView для ReadOnly.
Флажок добавляется булевым свойством. Поэтому я ищу советы о том, как выполнить задачу установки ячейки для чтения только на основе столбца с логическим свойством.WinForms DataGridView Checkbox

Ниже приведен фрагмент моего кода.

[DisplayName("Lock")] 
public bool RevenueLock { get; set; } 

revenue = new DomesticCostRevenue() 
{ 
RevenueLock = Convert.ToBoolean(values[10]), 
Revenue = Convert.ToDouble(values[11]) 
}; 
domestic.Add(revenue); 
} 
CostRevenueGridView.DataSource = domestic; 

Это то, что я сделал, но пока ничего не добился.

foreach (DataGridViewRow row in CostRevenueGridView.Rows) 
{ 
if ((bool)row.Cells["RevenueLock"].Value == true) 
{ 
row.Cells["Revenue"].ReadOnly = true; 

//MessageBox.Show("Lock"); 
} 
} 
+0

Вы можете установить весь столбец или всю строку или конкретную ячейку только для чтения –

+0

Как? Это то, что я пытаюсь понять. Я просто хочу определенную ячейку. – Abner

+0

В чем проблема с кодом выше? –

ответ

0

Благодарим за помощь. Наконец, я смог решить свою проблему. Следующий фрагмент - мое решение.

private void CostRevenueGridView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) 
    { 
     foreach (DataGridViewRow row in CostRevenueGridView.Rows) 
     { 
      foreach (DataGridViewCell cell in row.Cells) 
      { 
       if (cell.ColumnIndex == 12) 
       { 
        if (Convert.ToBoolean(CostRevenueGridView.Rows[row.Index].Cells[cell.ColumnIndex].Value)) 
        { 
         row.Cells[11].ReadOnly = true; 
        } 
       } 

      } 
     } 
    } 
1

Вы можете установить весь столбец или всю строку или конкретную ячейку только для чтения:

  • Колонка: this.dataGridView1.Columns[1].ReadOnly = true;
  • Ряд: this.dataGridView1.Rows[0].ReadOnly = true;
  • Сотовый: this.dataGridView1.Rows[0].Cells[1].ReadOnly = true;

Тест

Введите нижеприведенный код нажатием кнопки или в другом месте, чтобы отобразить форму для вас. В первом ряду, вторая ячейка будет только для чтения, так как первое значение ячейки верно:

var f = new Form(); 
f.Controls.Add(new DataGridView 
{ 
    Name = "g", 
    Dock = DockStyle.Fill 
}); 
f.Load += (se, ev) => 
{ 
    var g = ((Form)se).Controls["g"] as DataGridView; 
    g.AutoGenerateColumns = true; 
    g.AllowUserToAddRows = false; 
    g.DataSource = new List<C1> 
    { 
     new C1{P1=true, P2="x"}, 
     new C1{P1=false, P2="y"}, 
    }; 
    foreach (DataGridViewRow row in g.Rows) 
    { 
     if ((bool)row.Cells["P1"].Value == true) 
      row.Cells["P2"].ReadOnly = true; 
    } 
}; 
f.ShowDialog(); 

А вот код для класса С1:

public class C1 
{ 
    public bool P1 { get; set; } 
    public string P2 { get; set; } 
} 

Также проблема не существует с DataTable:

f.Load += (se, ev) => 
{ 
    var g = ((Form)se).Controls["g"] as DataGridView; 
    g.AutoGenerateColumns = true; 
    g.AllowUserToAddRows = false; 
    var dt = new DataTable(); 
    dt.Columns.Add("P1", typeof(bool)); 
    dt.Columns.Add("P2", typeof(string)); 
    dt.Rows.Add(true, "x"); 
    dt.Rows.Add(false, "y"); 
    g.DataSource = dt; 
    foreach (DataGridViewRow row in g.Rows) 
    { 
     if ((bool)row.Cells["P1"].Value == true) 
      row.Cells["P2"].ReadOnly = true; 
    } 
}; 
+0

Это странно, точка останова говорит readonly = true, но все еще редактируется – Abner

+0

У меня есть событие CellValueChange, если пользователи решили установить флажок, который он отлично работает. Но при настройке ячейки readonly извлечения из базы данных не работает. – Abner

+0

Переход к моей проверке. Ваш фрагмент похож на мой, но не удался в моем проекте. – Abner

0

Я воссоздал проблему путем создания DataTable, заселение с двумя колонками соответствия вашим, а затем с помощью foreach петля, которую вы опубликовали. Мои результаты были такими же, как у вас. Отдельные ячейки, которые были ReadOnly, все еще были доступны для редактирования.

Я не уверен, почему это так, но поскольку Реза получил его для работы с List<T>, я предполагаю, что он имеет какое-то отношение к DataTable.

Попробуйте подписаться на мероприятие RowsAdded и переместите туда свой чек. Имена столбцов могут не работать с этим кодом ... если нет, вместо этого используйте индексы столбцов.

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) 
{ 
    for (int index = e.RowIndex; index <= e.RowIndex + e.RowCount - 1; index++) 
    { 
     var currentRow = dataGridView1.Rows[index]; 

     if (Convert.ToBoolean(currentRow.Cells[0].Value)) 
      currentRow.Cells[1].ReadOnly = true; 
    } 
} 
+0

Я также пробовал 'DataTable', и он работает правильно. Я поделился полным кодом в сообщении. Вероятно, вы пытаетесь установить столбец readonly, когда в datagridview нет строки? –

+0

Не знаю, Реза. Мое приложение было очень маленьким. Создал «DataTable», добавил два столбца и несколько строк, назначил «DataTable» в «DataGridView» и попытался настроить определенные ячейки на «ReadOnly». Я все еще мог их редактировать. –

+0

В моей сетке есть данные. Но он по-прежнему ведет себя одинаково. – Abner

Смежные вопросы