在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的值,以便触发事件。 或者,您可以创建From
和To
计算属性,只需从您提到的Calendar
获取值; 再次确保在基础日历值更改时触发OnPropertyChanged
。 如果您正在使用MonthCalendar
,则可以通过监听其DateChanged
事件来执行此操作。
然后,让您的Scheduler
将IFromToDateProvider
作为构造函数参数并监听其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
监听ViewSchedule
的PropertyChanged
事件。
我不打扰静态字段……这种在表单之间来回传递值的问题已经被多次回答了……所以这就是我之前回答的问题的链接 。 它甚至可以逐步创建两个表单,并通过getter / setter甚至事件来获取值来回传递。 希望这可以帮助你。