将数据库中的字符串显示为复选框

时间:2014-05-12 14:59:12

标签: c# winforms data-binding

我有一个主要使用图形编辑器制作的Windows窗体。它连接到名为Database1的数据库。数据库中的一个表名为Table1,包含列CheckBox1。当我将表单连接到数据库时,会自动创建Database1DataSet.xsdDatabase1DataSet.Designer.cs

CheckBox1可以保持“是”或空白(这不是我的决定)。如果CheckBox1列中的值为“是”,我想复选一个复选框,如果值为空,则取消选中。如果我将绑定的复选框拖到窗体上,它就不起作用,因为我假设列中的值需要为1或0.所以我试图解决这个问题。

在我的表格中,我有以下

// Form Constructor
public myForm()
{
    // Initializes all the components in the form
    InitializeComponent();

    // Change the checkboxes checked state
    this.myCheckBox.Checked = myCheckBox_Update();
}

// Method for determining if the checkbox should be checked
private bool myCheckBox_Update()
{
    // This SHOULD bring in the current record of the database
    DataRowView current = (DataRowView)this.Table1BindingSource.Current;

    try 
    {
        // This SHOULD determine if the value in the CheckBox1 field has a value
        return current.Row["CheckBox1"].ToString().Length > 0;
    }
    catch (NullReferenceException ex)
    {
        MessageBox.Show("NullReferenceException was thrown!", "Error");

        return false;
    }
}

InitializeComponent()功能中,有以下

// This line is generated when I drag a bound checkbox to the form
// this.myCheckBox.DataBindings.Add(new System.Windows.Forms.Binding("CheckState", this.Table1BindingSource, "CheckBox1", true));

// For the miscellaneous information about the checkbox
this.myCheckBox.AutoSize = true;
this.myCheckBox.Location = new System.Drawing.Point(3, 3);
this.myCheckBox.Name = "myCheckBox";
this.myCheckBox.Size = new System.Drawing.Size(92, 23);
this.myCheckBox.TabIndex = 0;
this.myCheckBox.Text = "Check Box";
this.myCheckBox.UseVisualStyleBackColor = true;

然而,它不断抛出NullReferenceException。我假设这是因为this.Table1BindingSource.Current无法转换为DataRowView

我已经查看了与此问题有些相关的其他几个帖子(例如This postthis post),但我还没有找到任何有效的方法。第二个链接的答案不起作用,因为我使用this.Table1BindingSource.MoveNext();迭代记录,我不知道索引。

有人能引导我朝着正确的方向前进吗?我真的很感激


编辑:使用此

初始化BindingSource
private System.Windows.Forms.BindingSource Table1BindingSource;
this.Table1BindingSource = new System.Windows.Forms.BindingSource(this.components);

2 个答案:

答案 0 :(得分:0)

我会把它放在答案中,因为它不适合发表评论。

您也可以尝试在try语句中检查null值。

try 
{
    // This SHOULD determine if the value in the CheckBox1 field has a value
    object val = current.Row["CheckBox1"];
    if (val == null)
    {
        return false;
    }
    else
    { 
        return current.Row["CheckBox1"].ToString().Length > 0;
    }
}

或者至少在if(val == null)语句中设置断点,并确保val具有您期望的值。

如果用'blank'表示String.Empty,那么你的代码就可以按预期工作,但如果blank表示null,那么你必须检查null,你不能调用ToString()在空值上。

答案 1 :(得分:0)

我最终做的只是将数据库中的值从“是”和空白更改为1和0.然后在InitializeComponent()方法中,我添加了以下行(或者如果您可能为您生成从数据源面板中拖出它)

this.myCheckBox.DataBindings.Add(new System.Windows.Forms.Binding("CheckState", this.Table1BindingSource, "CheckBox1", true));