2015-02-20 3 views
1

Я много просматривал в StackOverflow и по всему интернету, но не мог найти ничего, что могло бы мне помочь. Я помещаю некоторую информацию из базы данных SQL в DataGridView, и добавляю дополнительный столбец с флажками.Проверка CheckBox DatagridView возвращает FormatExceptiion

private void populatedataGrid() 
{ 
    String sql = "SELECT pm.Name, pm.telephone, pm.email, pm.validID, comp.name as `Company` FROM `project managers`as pm JOIN `companies`as comp ON pm.Companies_companyID = comp.companyID where pm.Companies_companyID =" + loginID; 
    MySqlCommand command = new MySqlCommand(sql, dh.Connection); 

    try 
    { 
    MySqlDataAdapter adapter = new MySqlDataAdapter(); 
    adapter.SelectCommand = command; 
    DataTable dbdataset = new DataTable(); 
    adapter.Fill(dbdataset); 
    BindingSource bSource = new BindingSource(); 

    // DataGridView1 is a different DataGrid, i am working on DataGridView2 
    bSource.DataSource = dbdataset; 
    dataGridView1.DataSource = bSource; 
    dataGridView2.DataSource = bSource; 
    //Method for adding the additional column with checkboxes (ill paste the method below) 
    addCheckBoxColumn(); 
    //I make it so that only the checkboxes can be edited 
    foreach (DataGridViewColumn dc in dataGridView2.Columns) 
    { 
     if (dc.Index.Equals(5)) 
     { 
     dc.ReadOnly = false; 
     } 
     else 
     { 
     dc.ReadOnly = true; 
     } 
    } 
    adapter.Update(dbdataset); 
    } 
    catch (Exception ex) 
    { 
    MessageBox.Show(ex.Message); 
    } 
    finally 
    { 
    dh.Connection.Close(); 
    } 
} 

Вот метод для создания колонки с флажками:

private void addCheckBoxColumn() 
{ 
    DataGridViewCheckBoxColumn cbCol = new DataGridViewCheckBoxColumn(); 
    cbCol.ValueType = typeof(bool); 
    cbCol.Name = "Select"; 
    cbCol.HeaderText = "Select"; 
    dataGridView2.Columns.Add(cbCol); 
} 

И теперь все работает отлично: DataGridView

Я создал кнопку для целей тестирования, которые я хочу при нажатии, чтобы записать количество строк, на которых отмечен checkbox на label2.

private void button1_Click(object sender, EventArgs e) 
{ 
    int counter = 0; 
    foreach (DataGridViewRow row in dataGridView2.Rows) 
    { 
    if (Convert.ToBoolean(row.Cells[5].Value)) 
    { 
     counter++; 
    } 
    } 
    label2.Text = counter.ToString(); 
} 

Когда я запустить его и нажать кнопку Button1 я получаю следующее исключение:

«Необработанное исключение типа 'System.FormatException' произошло в mscorlib.dll

Дополнительная информация: Струнный не был признан действительным булевым ».

Можете ли вы мне помочь, как исправить это. Я написал подобный поток полчаса назад, когда у меня возникла другая проблема, но он получил Duplicated, поэтому я попытался изменить свой код, и теперь я получаю это.

+0

Укажите фактическое исключение. Включите трассировку стека. – tdbeckett

ответ

1

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

if (Convert.ToBoolean(row.Cells["Select"].Value)) { 
    ... 
} 

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

+0

Это действительно так, спасибо, что указали это. Я исправил это, но, к сожалению, я все равно получаю то же исключение. Я сделал снимок экрана, чтобы вы могли видеть лучше. http://i.imgur.com/Gn2M2OF.png –

+0

@ КонстантинХаджиев Какова ценность этой ячейки, когда вы получаете ошибку? Я воссоздал вашу ошибку, и она исчезла, когда я применил исправление. – LarsTech

+0

Как вы, вероятно, видели на скриншоте выше, у моего фактического datagrid есть 2 строки, и я проверил checkBoxes на обеих строках, поэтому теоретически счетчик должен быть равен 2. Я думаю, что я что-то пропустил, а его прослушивание меня в течение последних 4 часов. –

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