1

我无法从数据库的布尔列中正确填充 DataGridView 复选框列。

第一个 form_load 代码:

Me.DataGridView1.DataSource = Me.bindingSource1
GetData("SELECT myInt, myBool, myString " & _
        "FROM " & myFavTable & " " & _
        "WHERE (myInt > 100) ORDER BY myString")

formatGrid()

在 GetData 我用数据填充 myTable:

Me.dataAdapter.Fill(myTable)
Me.bindingSource1.DataSource = myTable

最后我在显示之前格式化网格。

我手动格式化它,因为加载比自动格式化快得多。

    With DataGridView1
        .AllowUserToAddRows = False
        .AllowDrop = False
        .AllowUserToOrderColumns = False
        .AllowUserToResizeRows = False
        .SelectionMode = DataGridViewSelectionMode.FullRowSelect
        .MultiSelect = False
        .Dock = DockStyle.Fill
        .EditMode = DataGridViewEditMode.EditProgrammatically

       With .Columns(0)
            .Name = "postN"
            .HeaderText = "Postal"
            .Width = 55
        End With

        With .Columns(1) 'here should be a checkbox
            .Width = 20
        End With

        With .Columns(2)
            .Name = "colCity"
            .HeaderText = "City"
            .Width = 180
        End With
    End With

但是使用此代码,在我应该显示复选框的列中,字符串值0在数据库中显示为FALSE.

在这种情况下,如何在中间列而不是文本中获得复选框?

我在绑定之前和之后尝试使用 .Columns.Add... 但没有想要的结果。
这样我就可以得到checkboxes,但在新列中。

4

3 回答 3

2

在设计时将列添加到 DataGridView 并将中间列设置为 CheckBoxColumn。

然后设置:

With DataGridView1
   .AutoGenerateColumns = False

编辑: 我现在看到了问题。您需要将 DataPropertyName 设置为与列相同。

当您向 DataGridView 添加列时,在该对话框中设置 DataPropertyName 以匹配 DataTable (myTable) 列名称。这就是映射背后的魔力。

在此处输入图像描述

这是代码:

DataTable dt = new DataTable();
dt.Columns.Add("TextBoxCol");
dt.Columns.Add("CheckBoxCol");
DataRow dr = dt.NewRow();
dr[0] = "Hello";
dr[1] = false;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "World";
dr[1] = true;
dt.Rows.Add(dr);
dataGridView1.DataSource = dt;

在此处输入图像描述

于 2013-01-14T23:11:40.317 回答
2

我有同样的问题。我有一个用这个 SQL 填充的 DataSet:

"SELECT nombre, CASE WHEN fecha IS NULL THEN 0 ELSE 1 END AS baja"

任务

dtgEmpleado.DataSource = ds.Tables(0)

With dtgEmpleado
    .Columns(0).HeaderText = "Nombre"
    .Columns(0).DataPropertyName = "nombre"
    .Columns(0).Name = "nombre"
    .Columns(0).Width = 100
    .Columns(1).HeaderText = "Baja"
    .Columns(1).DataPropertyName = "baja"
    .Columns(1).Name = "baja"
    .Columns(1).Width = 70
End With

我希望将“Baja”列显示为“复选框”。

我可以这样做:

AutoGenerateColumns = False

但更简单的方法,改变 SQL 语句:

"SELECT nombre, CAST(CASE WHEN fecha IS NULL THEN 0 ELSE 1 END AS BIT) AS baja"
于 2016-08-08T14:19:07.133 回答
1
Dim cell As DataGridViewCell = New DataGridViewCheckBoxCell()

With DataGridView1
    With .Columns(1)
        .CellTemplate = cell
    End With
End With

编辑:

这是一个建议,不要尝试在您的设计时添加列,DataGridView因为您自己查询它会生成一个DataGridViewCheckBoxCell

GetData("SELECT myInt AS Id, myBool AS Bool, myString AS String " & _
        "FROM " & myFavTable & " " & _
        "WHERE (myInt > 100) ORDER BY myString")


Me.dataAdapter.Fill(myTable)
Me.bindingSource1.DataSource = myTable

DataGridView1.DataSource = bindingSource1;
于 2013-01-14T23:12:51.120 回答