Использование динамического списка пользовательских объектов и не может динамически изменять свойства ячеек dataGrid

Я новичок в размещении в стеке. Я довольно долго искал проблему, похожую на мою. Я пытаюсь изменить флажки в WinForms DataGridView с не только для чтения на только для чтения на основе динамического логического значения объекта.

В режиме отладки он показывает, что изменение произошло, но после его полного прохождения ячейки флажков, которые должны быть доступны только для чтения, по-прежнему позволяют проверять и снимать функциональность. Я оставил закомментированный раздел, чтобы показать, что я пытался сделать это.

m_SingletonForm.dataGridView1.DataSource = list;
m_SingletonForm.dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
m_SingletonForm.dataGridView1.Columns["StoreGroup"].ReadOnly = true;
m_SingletonForm.dataGridView1.Columns["Message"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
m_SingletonForm.dataGridView1[0, 0].ReadOnly = true;


foreach (DataGridViewRow row in m_SingletonForm.dataGridView1.Rows)
{
    //var isChecked = Convert.ToBoolean(row.Cells["SendFile"].Value);

    //if (!isChecked)
    //{
        //m_SingletonForm.dataGridView1.Rows[0].Cells["SendFile"].Style.BackColor = Color.Red;
        //m_SingletonForm.dataGridView1.Rows[0].Cells["SendFile"].ReadOnly = true;

        //m_SingletonForm.dataGridView1.Rows[row.Index].Cells["SendFile"].Style.BackColor = Color.Red;
        //m_SingletonForm.dataGridView1.Rows[row.Index].Cells["SendFile"].ReadOnly = true;
        //m_SingletonForm.dataGridView1["SendFile", row.Index].ReadOnly = true;
        //m_SingletonForm.dataGridView1["SendFile", row.Index].Style.BackColor = Color.Red;          
    // }
}

m_SingletonForm.label1.Text = message;
m_SingletonForm.Text = title;
MessageBox.Show(m_SingletonForm.dataGridView1[0, 0].ReadOnly.ToString());
m_SingletonForm.ShowDialog();

Любая помощь будет принята с благодарностью.

1 ответ

Решение

С линии m_SingletonForm.ShowDialog(); кажется, что у вас есть этот код до DataGridView был отображен *. Это слишком рано для применения таких изменений к элементам сетки. Вы также увидите ту же проблему, если ваш код был внутри конструктора для вашей формы.

Самое простое решение этой проблемы - поместить код для настройки ячеек только для чтения в пределах DataBindingComplete обработчик события. Что-то вроде этого:

// Attach the event
m_SingletonForm.dataGridView1.DataBindingComplete += new
    DataGridViewBindingCompleteEventHandler(dataGridView1_DataBindingComplete);


// And the code for the handler
void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    foreach (DataGridViewRow row in m_SingletonForm.dataGridView1.Rows)
    {
        var isChecked = Convert.ToBoolean(row.Cells["SendFile"].Value);

        if (!isChecked)
        {
            m_SingletonForm.dataGridView1.Rows[0].Cells["SendFile"].Style.BackColor = Color.Red;
            m_SingletonForm.dataGridView1.Rows[0].Cells["SendFile"].ReadOnly = true;

            m_SingletonForm.dataGridView1.Rows[row.Index].Cells["SendFile"].Style.BackColor = Color.Red;
            m_SingletonForm.dataGridView1.Rows[row.Index].Cells["SendFile"].ReadOnly = true;
            m_SingletonForm.dataGridView1["SendFile", row.Index].ReadOnly = true;
            m_SingletonForm.dataGridView1["SendFile", row.Index].Style.BackColor = Color.Red;
        }
    }            
}

* Я никогда на 100% не понимал, почему это так - я полагаю, это связано с тем, что в DataGridView - ячейки редактирования / пользовательского интерфейса и данные, на которых они сидят.

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