2016-03-09 3 views
2

У меня есть DataGridView, у которого DataSource есть DataTable с пятью столбцами. Если я пытаюсь получить доступ к ReadOnly свойства столбца, например, так:Сделать автоматический сгенерированный столбец только в DataGridView

datagridview.Columns[1].ReadOnly = true; 

Он бросает NullReferenceExcpetion.

Я понимаю, что это связано с тем, как структура управляет автоматически создаваемыми столбцами, как отмечено ответом на this question.

Мой вопрос: Как сделать столбец (ы) readonly, когда источник данных сгенерирован автоматически?

+0

Пробовали ли вы с помощью 'DataBindingComplete' событие? Я почти уверен, что когда это событие уволено, у вас уже есть доступ ко всем автогенерированным столбцам ... попробуйте. Просто откройте панель EVENTS и дважды щелкните по событию, затем отлаживайте и проверяйте столбцы. – balexandre

+0

@balexandre Да, это тоже работает! Сделайте это ответом, и я приму это. – TEK

ответ

1

Не могу сказать, почему это не работает, но простой тест с этим кодом:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     dataGridView1.AutoGenerateColumns = true; 
     dataGridView1.DataSource = GenerateData(); 

     dataGridView1.Columns[0].ReadOnly = true; 
    } 

    private List<DataSourceTest> GenerateData() 
    { 
     return new List<DataSourceTest>() 
     { 
      new DataSourceTest(1, "A"), 
      new DataSourceTest(2, "B"), 
      new DataSourceTest(3, "C"), 
      new DataSourceTest(4, "D"), 
      new DataSourceTest(5, "E"), 
      new DataSourceTest(6, "F"), 
     }; 
    } 
} 

public class DataSourceTest 
{ 
    public DataSourceTest(int id, string name) { ID = id; Name = name; } 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

и делает множество GridView EditMode к EditOnEnter так что мы можем легко проверить, если это только для чтения или нет, показывает что он хорошо выполняет свою работу.

Но если вы все еще есть проблемы, то лучше всего использовать событие, и самое близкое событие для вашего вопроса является DataBindingComplete, который будет срабатывать после связывания будет сделано, так что в то время, вы будете иметь полный доступ ко всем столбцам, поскольку они уже привязаны к объекту gridview.

двойной щелчок на событии в GridView контроля и добавить только для чтения сеттер:

private void dataGridView1_DataBindingComplete(
    object sender, DataGridViewBindingCompleteEventArgs e) 
{ 
    dataGridView1.Columns[0].ReadOnly = true; 
} 
+0

Это головной скребок, но использование события «DataBindingComplete» сработало для меня. Очевидно, что у меня есть флаг свойства, который где-то по пути, который вызывает у меня проблемы. Однако между этим и моим ответом моя проблема решена. Спасибо. – TEK

0
колонка

Make только для чтения, когда колонна была сформирована

private void Form1_Load(object sender, EventArgs e) 
    { 

     List<Student> allStudent = new List<Student>(); 

     for (int i = 0; i < 10; i++) 
     { 
      allStudent.Add(new Student { Name = "Student" + i, Roll = i + 1 }); 
     } 

     dataGridView1.AutoGenerateColumns = true; 
     dataGridView1.DataSource = allStudent; 

     //Edited to show column count 
     MessageBox.Show("Column count is " + dataGridView1.Columns.Count); 

     foreach (DataGridViewColumn column in dataGridView1.Columns) 
     { 
      column.ReadOnly = true; 
     } 

    } 

    public partial class Student 
    { 
     public string Name { get; set; } 
     public int Roll { get; set; } 
    } 
+0

Поскольку он использует 'AutoGeneratedColumns', счетчик столбцов всегда будет возвращать 0, что означает, что содержимое цикла никогда не будет выполнено. Осмотрите 'datagridview.Columns.Count'. Спасибо за ваш ответ. – TEK

+0

Нет .... это не будет .. попробуйте пример один раз .. @ TEK – Moumit

+0

@Momit Количество столбцов возвращается 0. Извините, не знаю, что сказать. – TEK

0

В истинном TEK моде, я понял, решение мой собственный вопрос:

Чтобы сделать это, вам нужно использовать ColumnAdded событие

datagridview.ColumnAdded += dataGridView_ColumnAdded; 

Тогда в случае, вы можете проверить столбец по имени:

private void dataGridView_ColumnAdded(object sender, DataGridViewColumnEventArgs e) 
    { 
     if (e.Column is DataGridViewColumn) 
     { 
      DataGridViewColumn column = e.Column as DataGridViewColumn; 
      column.ReadOnly = true; 
      if (column.Name == "first_name") 
      { 
       column.ReadOnly = false; 
      } 
     } 
    } 
Смежные вопросы