Вопрос по c#, .net, winforms, datagridview, checkbox – Datagridview заставляет выбрать только один флажок в столбце

3

Как принудительно установить только один флажок в столбце Datagridview?

Чтобы оставаться совместимым со всей индустрией компьютерного программного обеспечения, используйте переключатели вместо флажков. Флажок списка означает, что вы можете выбрать несколько элементов, а переключатели означают, что вы можете выбрать только один для группы. Может быть решение вашей проблемы, но я настоятельно советую вам не идти в этом направлении. Если вы установите флажки вместо переключателя, потому что вы не разрешаете вводить значения, добавьте радиокнопку «нет» или «очистить» Кнопка, чтобы выбрать нет опции. Steve B
@ SteveB Я знаю, что опоздал на этот комментарий, но не вижу радиокнопку в Winforms Datagridview? Richard Griffiths

Ваш Ответ

9   ответов
2
    private void dataGridViewProduit_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        if ((sender as DataGridView).CurrentCell is DataGridViewCheckBoxCell)
        {
            if (Convert.ToBoolean(((sender as DataGridView).CurrentCell as DataGridViewCheckBoxCell).Value))
            {
                foreach (DataGridViewRow row in (sender as DataGridView).Rows)
                {
                    if (row.Index != (sender as DataGridView).CurrentCell.RowIndex && Convert.ToBoolean(row.Cells[e.ColumnIndex].Value) == true)
                    {
                        row.Cells[e.ColumnIndex].Value = false;
                    }
                }
            }
        }
    }

    private void dataGridViewClient_CurrentCellDirtyStateChanged(object sender, EventArgs e)
    {
        if (this.dataGridViewClient.IsCurrentCellDirty)
        {
            dataGridViewClient.CommitEdit(DataGridViewDataErrorContexts.Commit);
        }
    }
0

Private Sub DataGridViewJobsList_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridViewJobsList.CellValueChanged
    If TypeOf TryCast(sender, DataGridView).CurrentCell Is DataGridViewCheckBoxCell Then
        Dim cell1 As DataGridViewCell
        cell1 = TryCast(sender, DataGridView).CurrentCell
        If cell1.Value = True Then
            For Each row As DataGridViewRow In TryCast(sender, DataGridView).Rows
                If row.Index <> cell1.RowIndex AndAlso row.Cells(e.ColumnIndex).Value = "1" Then
                    row.Cells(e.ColumnIndex).Value = False
                End If
            Next
        End If
    End If
End Sub

Private Sub DataGridViewJobsList_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs) Handles DataGridViewJobsList.CurrentCellDirtyStateChanged
    If Me.DataGridViewJobsList.IsCurrentCellDirty Then
        DataGridViewJobsList.CommitEdit(DataGridViewDataErrorContexts.Commit)
    End If
End Sub
-2
private void dataGridView3_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 1)
            {
                try
                {
                    string val = dataGridView3.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
                    if (val == "False")
                        val = "True";
                    else if (val == "True")
                        val = "False";
                    dataGridView3.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = val;

                for (int i = 0; i < dataGridView3.Rows.Count; i++)
                {
                    string active = "";
                    if (i != e.RowIndex)
                    {
                        if (val == "False")
                        {
                            dataGridView3.Rows[i].Cells[1].Value = "True";
                            active = "Y";
                        }
                        else if (val == "True")
                        {
                            dataGridView3.Rows[i].Cells[1].Value = "False";
                            active = "N";
                        }
                    }
                    else
                    {
                        if (val == "False")
                            active = "N";
                        else
                            active = "Y";
                    }




                }


            }
            catch (Exception ex)
            { }
        }
    }
0

Ты можешь использоватьCellEndEdit событиеDGV, как это происходит после того, как ячейка модифицируется. Пожалуйста, прочитайте комментарии в приведенном ниже фрагменте кода, чтобы использовать код ниже:

private void dgrvUserProfileView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    int CheckedCount = 0;

    //Make sure you have set True Value/ false Value property of check box column to 1/0 or true/false resp.
    //Lets say your column 5th(namely Department) is a checked box column
    if (dgrvUserProfileView.Columns[e.ColumnIndex].Name == "Department")
    {
        for (int i = 0; i <= dgrvUserProfileView.Rows.Count - 1; i++)
        {
            if (Convert.ToBoolean(dgrvUserProfileView.Rows[i].Cells["Department"].Value) == true)
            {
                CheckedCount = CheckedCount + 1;
            }
        }

        if (CheckedCount == 1)
        {
            for (int i = 0; i <= dgrvUserProfileView.Rows.Count - 1; i++)
            {
                if (Convert.ToBoolean(dgrvUserProfileView.Rows[i].Cells["Department"].Value) == true)
                {
                    dgrvUserProfileView.Rows[i].Cells["Department"].ReadOnly = true;
                }
            }
        }
        else
        {
            for (int i = 0; i <= dgrvUserProfileView.Rows.Count - 1; i++)
            {
                dgrvUserProfileView.Rows[i].Cells["Department"].ReadOnly = false;
            }
        }
    }
}

Надеюсь это поможет!

или взять ссылку из этого ответаstackoverflow.com/questions/10438613/…
0

VirtualMode установка наTRUE наDGV разрешить только один флажок. и вы можете установитьVirtualMode установка наFALSE наDatagridView проверить больше, чем один.

Я думаю, что это самый простой способ решения.

3

Вам придется подписаться наCellValueChanged событие сетки и в зависимости от состояния проверки текущей ячейки зациклите DataGridView и установите true / false в качестве значения для других ячеек.

void grd_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
      if ((sender as DataGridView).CurrentCell is DataGridViewCheckBoxCell)
      {
           if (Convert.ToBoolean(((sender as DataGridView).CurrentCell as DataGridViewCheckBoxCell).Value))
           {
                   // Maybe have a method which does the
                    //loop and set value except for the current cell
            }
        }
}
@SteveB Проверьте тег егоwinform
@ V4Vendetta Просто вопрос, почему CellValueChanged вместо CellContentClick? Насколько я понимаю, событие CellValueChanged генерируется, когда любая из ячеек & apos; содержимое изменяется, но событие CellContentClick генерируется, когда щелкается только определенное содержимое в ячейке (в этом случае - флажок I.E: не будет ли использование события CellContentClick предпочтительным? l46kok
@ V4Vendetta: неправильно прочитал вопрос. сожалею
@SokwhanHuh Его будет работать только после изменения значения, щелчок по контенту может выполняться несколько раз, пока ячейка все еще находится в режиме редактирования, но после того, как редактирование завершено и с помощью запуска ValueChanged, так что имеет смысл обрабатывать его там. (Также это не единственный способ, но один из способов)
решение на стороне клиента (jquery может сильно помочь) гораздо предпочтительнее, это позволит избежать десятков обратных передач
4
 private void grdRegClass_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        if (grdRegClass.Columns.IndexOf(grdRegClass.Columns["Status"]) == e.ColumnIndex)
        {
            int currentcolumnclicked = e.ColumnIndex;
            int currentrowclicked = e.RowIndex;
            foreach (DataGridViewRow dr in grdRegClass.Rows)
            {
                dr.Cells[currentcolumnclicked].Value = false;
            }
            grdRegClass.CurrentRow.Cells[currentrowclicked].Value = true;  
        }
    }
0
private void dgvlist_CellContentClick(object sender, DataGridViewCellEventArgs e)  
    {  
        int currentcolumnclicked = e.ColumnIndex;  
        for (int i = 0; i <= dgvlist.Columns.Count - 1; i++)  
        {  
            if (dgvlist.Columns[i] is DataGridViewCheckBoxColumn)  
            {  
                if (Convert.ToString(dgvlist.CurrentRow.Cells[i].EditedFormattedValue) == "True" && i !=currentcolumnclicked)  
                {  
                    dgvlist.CurrentRow.Cells[i].Value = false;  
                }  
            }  
        }  
    }  
0
private void dgvCaixa_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if ((sender as DataGridView).CurrentCell is DataGridViewCheckBoxCell)
            {
                foreach (DataGridViewRow row in dgvCaixa.Rows)
                {
                    if (row.Index != dgvCaixa.CurrentCell.RowIndex && Convert.ToBoolean(row.Cells[e.ColumnIndex].Value) == true)
                    {
                        row.Cells[e.ColumnIndex].Value = false;
                    }
                }
            }
        }
Можете ли вы объяснить, как это решает проблему.

Похожие вопросы