【问题标题】:Displaying a checkbox in a databound DataGridView在数据绑定 DataGridView 中显示复选框
【发布时间】:2013-01-14 22:58:33
【问题描述】:

我无法从数据库的布尔列中正确填充 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,但在新专栏中。

【问题讨论】:

  • 我授权@spajce 对您的标题进行编辑。请参阅"Should questions include “tags” in their titles?",其中的共识是“不,他们不应该”
  • 我没有做标签!只是想像描述的那样对“DataGridView”有所帮助。通过删除标题的关键部分,您无法使它变得更好!
  • 我只是想澄清一下我们想说的话,尝试查看您的 previous 帖子,如果注意到您有一个标签并且您的标题提到了 DataGridView,因此标记DataGridView 不是让我们成为我们的标题,因为通过我们的tags 它将对我们的帖子进行分类。我希望你明白:)
  • 我当然明白。那么您的用户标题“在 VB.NET 中填充 DataGridView”会怎样? “填表”?

标签: vb.net datagridview


【解决方案1】:

在设计时将列添加到 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;

【讨论】:

  • 这样我得到新的列??设计时+运行时一起使用。
  • 如果您看到两倍的列数,那没关系,只需不要在运行时添加它们(因为您已在设计时指定它们)。否则,请查看 Form1.Designer.vb 代码以了解如何创建设计时列并重用该代码并在运行时创建列。
  • 我没有创建运行时列,是的。绑定源还是什么?如果我想保持绑定状态,我无法删除它。
  • 嗯,我不知道。给出 DatapropertyName 后,我得到错误“0”对于布尔值不正确。然后我重新检查我在数据库中的列是否真的是布尔值。它是(真/假)。然后我设置 FalseValue“0”和 TrueValue“1”,然后切换文本框,如数据库中的 TRUE 或 FALSE。然后我必须将 DataPropertyName 提供给所有其他(文本列),以便在网格中获取数据。然后为每列设置其他属性。老实说,由于许多类似的现有代码,我非常希望在运行时获得所有这些。但是您的解决方案有效。非常感谢。
  • 嗯,一次又一次。我不应该添加任何列!只是为了更改现有自动生成的属性。当我写信给“spajce”时,我可以使用未绑定的 DGV 轻松获得复选框。
【解决方案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"

【讨论】:

    【解决方案3】:
    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;
    

    【讨论】:

    • 为 CellTemplate 提供的值必须是 System.Windows.Forms.DataGridViewTextBoxCell 类型或派生自它。
    • 谢谢,但同样的结果。事实是我没有在我的问题中添加任何列。只需格式化它以避免非常慢的自动格式化(AutoResizing)。从这个角度来看,我的 datagridview 是绑定并手动格式化的。如果我完全删除我的格式,这些列中仍然有 0/1。在某种程度上,我必须告诉 column(1) 应该有复选框。通过在运行时添加适当的列,我很容易通过 znbinded 网格实现这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    相关资源
    最近更新 更多