我有一个 System.Windows.Controls.DatePicker ( name =" rMethod" )组件,当我从外面设置它的值时,这个事件被调用:
private void rMetod_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
我有这个日期选择器的双重职责。当表格中有日期时,我想从数据库中填写这个日期选择器。当没有日期数据时,我希望这个日期选择器能够将所选日期保存到数据库中。
但是,即使表中存在日期数据,也会调用我的INSERT SQL命令,这会导致重复键SQL异常,因为在使用此语句时会调用相同的事件:
rMethod.Text = "10/10/1970"
如何使用自定义args调用 SelectedDateChanged 并能够解决正确的操作,即如果表中没有保存日期数据,则应执行INSERT,并且何时执行是,只需运行SELECT命令或用预取值填充此日期选择器?
答案 0 :(得分:2)
我认为你的方向是错误的。 EventArgs
不应该手动实例化,并且事件处理程序不应该手动调用。
而不是依附于SelectionChangedEventArgs
和DatePicker
,而是将您的逻辑移动到可以处理这两种情况的方法。
例如,您可以使用一些全局标记来处理该日期。
public partial class MainWindow : Window
{
bool dateExists = false;
public MainWindow()
{
InitializeComponent();
}
}
当您从数据库中获取数据时,如果存在日期,请将flag设置为true,如下所示
if (reader["Date"] != DbNull.Value)
dateExists = true;
稍后,在您的插入方法中,您可以检查您的标志并根据它的设置日期。
if (!dateExists) //there was no date in database
cmd.Parameters.AddWithValue("@date", DateTime.Now);
else
cmd.Parameters.AddWithValue("@date", rMethod.SelectedDate);
我希望你理解这种方法。