在C#中将日期值从一个Windows传递到另一个窗体

我正在开发一个非常复杂的项目,我对Windows项目非常新。
我有2个表格:

  • ViewSchedule.cs
  • Scheduler.cs (它是一个对话框表格)

ViewSchedule.cs有两个日历可供选择。 选择了两个日期。
它们保存在Resp中:

 _fromDate = dtFromDate.DateTime.ToUniversalTime(); _toDate = dtToDate.DateTime.ToUniversalTime(); 

表2,即Scheduler.cs是一个dialogForm。 此处在ViewScheduler选择的日期应显示在此处。

我需要帮助。

您需要在对话框窗体中创建公共属性,并在显示对话框之前设置这些属性。

然后onLoad使用这些属性值。

在form2中添加这些日期属性:

 public partial class Form2 : Form { public DateTime Date1 { get; set; } public DateTime Date2 { get; set; } public Form2() { InitializeComponent(); } } 

从form1访问这些如下:

 private void Form1_Load(object sender, EventArgs e) { Form2 frm2 = new Form2(); frm2.Date1 = DateTime.Now; frm2.Date2 = DateTime.Now; frm2.ShowDialog(); } 

最简单的方法是确保定义两个日期的这两个变量是public static以便可以通过另一个表单访问它们。 如果您想仅在更改值时更新其他表单。 然后,我建议您使用第二种forms的Timer和第一种forms的bool ,以指示日期是否更改。

ViewSchedule.cs

 //These values must be static and public so that they'd be accessible through the second form public static bool DateChanged = false; public static DateTime _fromDate; public static DateTime _toDate; private void SetValues() { _fromDate = dtFromDate.DateTime.ToUniversalTime(); _toDate = dtToDate.DateTime.ToUniversalTime(); DateChanged = true; //Set DateChanged to true to indicate that there has been a change made recently } 

Scheduler.cs

 public Scheduler() { InitializeComponent(); timer1.Tick += new EventHandler(timer1_Tick); //Link the Tick event of timer1 to timer1_Tick } DateTime _fromDate; //Set a new variable of name _fromDate which will be used to get the _fromDate value of ViewSchedule.cs DateTime _toDate; ////Set a new variable of name _toDate which will be used to get the _toDate value of ViewSchedule.cs private void timer1_Tick(object sender, EventArgs e) { if (Form1.DateChanged) //Check if a change has been done recently { Form1.DateChanged = false; //Set the change to false so that the timer won't repeat _fromDate = Form1._fromDate; //Set our value of _fromDate from Form1._fromDate _toDate = Form1._toDate;//Set our value of _toDate from Form1._toDate } } 

这会将Scheduler.cs的值设置为ViewSchedule.cs的新值,我认为这是您想要实现的目标

谢谢,
我希望你觉得这有用 :)

您应该为Scheduler一个显式数据源,并使用事件通知它基础日期的更改。 一个好主意是为数据源提供自己的界面:

 interface IFromToDateProvider : INotifyPropertyChanged { DateTime From { get; } DateTime To { get; } } 

然后让ViewSchedule实现这个接口:

 class ViewSchedule : IFromToDateProvider { DateTime _from; public DateTime From { get { return _from; } set { if (_from == value) return; _from = value; OnPropertyChanged("From"); } } DateTime _to; public DateTime To { get { return _to; } set { if (_to == value) return; _to = value; OnPropertyChanged("To"); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } 

确保使用属性更新from和to的值,以便触发事件。 或者,您可以创建FromTo计算属性,只需从您提到的Calendar获取值; 再次确保在基础日历值更改时触发OnPropertyChanged 。 如果您正在使用MonthCalendar ,则可以通过监听其DateChanged事件来执行此操作。

然后,让您的SchedulerIFromToDateProvider作为构造函数参数并监听其PropertyChanged事件:

 class Scheduler { readonly IFromToDateProvider _provider; public Scheduler(IFromToDateProvider provider) { _provider = provider; _provider.PropertyChanged += provider_PropertyChanged; } void provider_PropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs) { // update display with new values in _provider.From and/or // _provider.To in this event handler } } 

这假设ViewSchedule创建了一个Scheduler实例。 如果反之亦然,只需让Scheduler在创建ViewSchedule后监听该事件。 如果两者都没有,只需将其设置为属性; 最重要的是,您最终会使用Scheduler监听ViewSchedulePropertyChanged事件。

我不打扰静态字段……这种在表单之间来回传递值的问题已经被多次回答了……所以这就是我之前回答的问题的链接 。 它甚至可以逐步创建两个表单,并通过getter / setter甚至事件来获取值来回传递。 希望这可以帮助你。