【问题标题】:Int field in Winform does not update null values in SQL Server database using C#Winform 中的 Int 字段不使用 C# 更新 SQL Server 数据库中的空值
【发布时间】:2016-09-10 08:36:24
【问题描述】:

在我的 Winforms C# 应用程序中,我有 Int 数据类型的字段,它们被设置为在 SQL Server 数据库中接受空值(允许空值)。

在表单中,我有一些绑定到 int 数据类型字段的 文本框。如果我在创建新记录时没有输入任何内容,它会接受。如果我在文本框中输入一个数字,它也接受它,然后如果我删除它,它不再接受它,甚至不允许我移动到下一个字段。

如果我通过代码将其值设置为 null 或 "",它只会忽略甚至不更新我在其他非 int 文本字段中所做的更改。

我正在使用以下方法进行更新。

this.Validate();
this.itemsbindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.sBSDBDataSet);

文本框如何才能接受空值?

我已尝试关注。

IDTextBox.Text = "";
IDTextBox.Text = null;

【问题讨论】:

  • DataSource 使用什么itemsBindingSource
  • 数据源是'sBSDBDataSet'。
  • 但是sBSDBDataSet 是什么?记住我们没有你的代码,看问题,这就是我们所看到的。
  • 嗨,Ivan,sBSDBDataSe 是我在表单上使用的数据集名称。我已经使用 sqlserver 数据库中的“添加新数据源”在 Visual Studio windowsform 项目中添加了数据源。然后我简单地将这个添加的数据集拖到表单上并将其重命名为“sBSDBDataSet”。然后我使用工具箱控件将“itemsbindingSource”、itemsTableAdapter 和 tableAdapterManager 添加到表单中。因此,通过这种方式,我的表单使用 this.itemsTableAdapter.Fill(this.sBSDBDataSet.Items); 加载了数据。方法。然后我只是添加了上面分享的更新代码。
  • 好的。该问题很可能是由数据绑定引起的。您如何创建它们 - 使用设计器或通过代码?

标签: c# winforms sql-server-2012


【解决方案1】:

我已经尝试在上述解决方案的帮助下(特别是 Ivan 先生)进行跟踪,结果就是这样。

清除表单上的 int 字段:

IDTextBox.Text = String.Empty;

然后在表单的 Designer.cs 文件中,按照 Ivan 先生的建议,我搜索了“IDtextbox.DataBindings.Add”并替换了

this.IDTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.itemsbindingSource, "PictureID", true));

this.IDTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.itemsbindingSource, "PictureID", true, System.Windows.Forms.DataSourceUpdateMode.OnValidation, ""));

我花了一整天的时间搜索,最后我在这里发布了我的问题,并在1小时内得到了解决。

【讨论】:

    【解决方案2】:

    这似乎是 WF 数据绑定错误之一。我不能说到底是什么原因造成的,但为了让它工作,应该将Binding.NullValue属性设置为“”(空字符串,默认为null)。

    我在设计器中找不到这样做的方法,而且找到所有需要的文本框也很烦人。因此,我建议您采用以下快速而肮脏的方法。像这样创建一个辅助方法:

    public static class ControlExtensions
    {
        public static void FixTextBoxBindings(this Control control)
        {
            if (control is TextBox)
            {
                foreach (Binding binding in control.DataBindings)
                    if (binding.NullValue == null) binding.NullValue = "";
            }
            foreach (Control child in control.Controls)
                child.FixTextBoxBindings();
        }
    }
    

    然后在您的表单Load 事件中简单地包含以下内容:

    this.FixTextBoxBindings();
    

    【讨论】:

      【解决方案3】:

      TextBox 不接受空值。

      你可以检查它是否为空并设置 String.Empty;

      If(dbValue == null)
      {
         IDTextBox.Text = String.Empty;
      }
      else
      {
        // here set value to your textbox
      }
      

      【讨论】:

      • 嗨 mwisnicki。我在这个上有两个错误。 1.dbValue->名称dbValue在当前上下文中不存在。 2. String.Empty() -> Non-invokable member 'String.Empty' 不能像方法一样使用。我错过了什么吗?
      • "dbValue" 是您尝试设置到文本框的变量,您不能将 null 设置为文本框,因此您必须检查它是否为 null 设置的空字符串。
      • 嗨 mwisnicki。我已经尝试过了,但仍然无法正常工作。 var dbValue = (string)null; if(dbValue == null) { IDTextBox.Text = String.Empty; } else { // }
      • 显示所有代码。因为我不知道你尝试做什么。您不能强制转换并设置为字符串 null。展示你的工作
      • 这是我最初尝试做的。 private void btnRmvPic_Click(object sender, EventArgs e) { if (picturePictureBox.Image != null) { IDTextBox.Text = null;基于此,我需要在数据库中更新空值。此 ID 实际上是图片表中的唯一 ID。而如果我将它设置为Null,图片将不会显示在表单中,这是我正在尝试做的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多