DateTimePicker-仅在以下情况下正确更新绑定控件'ShowCheckBox' = True

雷耶斯

成员
已加入
2016年11月11日
留言内容
20
编程经验
1-3
大家好

我在做一个噩梦,试图让这个糟糕的DateTimePicker与DBNull值一起使用。我快到了,但还没到。这是我的情况。


  • 我有一个基于服务的数据库进行测试。其中有2个表:
    • 顾客
    • 财务-包含“客户ID”作为“客户”中相关列的FK。
      • 该表包含我遇到问题的列-允许为空的'SettledDate'列。
  • 我有一个类型化的数据集,只需将这些表中的每一个都放入其中-没有特殊的SQL查询,每个表中只有SELECT *。
  • 我的绑定代码为:

C#:
ds = new dsTest();

         private void button1_Click(object sender, EventArgs e)
        {
          dsTestTableAdapters.CustomersTableAdapter Cta = new dsTestTableAdapters.CustomersTableAdapter();
            dsTestTableAdapters.FinancesTableAdapter Fta = new dsTestTableAdapters.FinancesTableAdapter();


            Cta.Fill(ds.Customers);
            Fta.Fill(ds.Finances);


            bsCust = new BindingSource(ds, ds.Customers.TableName);
            bsFinance = new BindingSource(bsCust, ds.Relations["FK_Cust_Finance"].RelationName);


            tb_CustID.DataBindings.Add(new Binding("Text", bsCust, ds.Customers.CustIDColumn.ColumnName));
            tb_CustName.DataBindings.Add(new Binding("Text", bsCust, ds.Customers.FullNameColumn.ColumnName));


            // Treatments
            tb_TotalCost.DataBindings.Add(new Binding("Text", bsFinance, ds.Finances.TotalCostColumn.ColumnName));
            cb_Settled.DataBindings.Add(new Binding("Checked", bsFinance, ds.Finances.SettledColumn.ColumnName));
            dt_SettledDate.DataBindings.Add(new Binding("Text", bsFinance, ds.Finances.SettledDateColumn.ColumnName));
            dt_SettledDate.ValueChanged += new EventHandler(dt_SettledDate_ValueChanged);
}
        private void dt_SettledDate_ValueChanged(object sender, EventArgs e)
        {
            if(dt_SettledDate.Checked == false)
            {
                dt_SettledDate.Value = dt_SettledDate.MinDate;
                dt_SettledDate.Checked = false;
            }
        }

在我的“财务”表中有3行,第一行包含“ SettledDate”中的日期,第二行包含空值。我正在经历的是:



  • 当我单击按钮时,DateTimePicker显示数据库中包含的日期。然后,我单击“下一步”按钮,该按钮调用“ bsCust.MoveNext()”。
  • 此时,我在上面显示的事件处理程序中看到了“ MinDate”。再次单击下一步执行相同的操作。
  • 当我最终从第二条记录返回到第一条记录(包含实际日期)(从“ Previous”按钮调用“ MoveNext()”)时,现在不再显示日期,它只是显示了“ MinDate”。




  • 我在DateTimePicker控件上更改了“ ShowCheckBox”属性,运行该应用程序,然后再次尝试上述操作,现在,当我更改时,将记录所有应有的更新-它可以按我的期望和期望的方式工作。问题是,我不希望此复选框显示给客户端。

我很困惑,迷路了!

有任何想法吗?

在此先感谢您-如有任何帮助,我们将不胜感激!
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,553
地点
悉尼,澳大利亚
编程经验
10+
我只见过使用自定义控件有效完成此操作。有这样的控制 这里,用VB编写,我已经测试并确认可以正常工作。您可以将其编译为DLL,将代码转换为C#或寻找类似的现有C#控件。
 

雷耶斯

成员
已加入
2016年11月11日
留言内容
20
编程经验
1-3
我只见过使用自定义控件有效完成此操作。有这样的控制 这里,用VB编写,我已经测试并确认可以正常工作。您可以将其编译为DLL,将代码转换为C#或寻找类似的现有C#控件。
非常感谢jmcilhinney。但是一个问题:

如果像我这样向客户展示“ MinValue”,那么代码解决方案是否比带有明显不正确日期(例如,文字“ MinValue”)的默认数据库值更好?

我问,因为我经验不足,所以建议会很有帮助。为了使日期在客户端浏览应用程序中的记录时显然不相关,我可以简单地添加一些基本代码来管理日期选择器的显示。

使用Tapatalk从我的SM-G935F发送
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,553
地点
悉尼,澳大利亚
编程经验
10+
您应该基于数据而不是基于UI设计数据库。如果记录在逻辑上没有日期列的值,则该记录应包含null,而不是占位符值。

您可以在数据库数据和UI数据之间执行映射,以用占位符日期替换空值,反之亦然,但是,鉴于此解决方法允许您为空值显示空白的DTP,就像显示空白的TextBox一样,我认为那是最好的解决方案。
 

雷耶斯

成员
已加入
2016年11月11日
留言内容
20
编程经验
1-3
您应该基于数据而不是基于UI设计数据库。如果记录在逻辑上没有日期列的值,则该记录应包含null,而不是占位符值。

您可以在数据库数据和UI数据之间执行映射,以用占位符日期替换空值,反之亦然,但是,鉴于此解决方法允许您为空值显示空白的DTP,就像显示空白的TextBox一样,我认为那是最好的解决方案。
一切都有道理。有逻辑的地方,我听!

非常感谢。我将转换该代码。

使用Tapatalk从我的SM-G935F发送
 
最佳 底部