我正在开展一个非常复杂的项目,我对Windows项目非常陌生 我有2个表格:
ViewSchedule.cs
Scheduler.cs
(这是一个对话形式) ViewSchedule.cs
有两个日期可供选择。选择了两个日期。
他们保存在Resp:
_fromDate = dtFromDate.DateTime.ToUniversalTime();
_toDate = dtToDate.DateTime.ToUniversalTime();
表单2,即Scheduler.cs
是dialogForm。此处ViewScheduler
中选择的日期应显示在此处。
我需要帮助。
答案 0 :(得分:1)
您需要在对话框窗体中创建公共属性,并在显示对话框之前设置这些属性。
然后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();
}
答案 1 :(得分:0)
最简单的方法是确保定义两个日期的这两个变量为public static
,以便可以通过其他形式访问它们。如果您希望仅在更改值时更新其他表单。然后,我建议您在第二种形式中使用Timer
,在第一种形式中使用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
的新值,我认为这是您想要实现的目标
谢谢, 我希望你觉得这很有帮助:)
答案 2 :(得分:0)
您应该为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
event来完成此操作。
然后,让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
收听PropertyChanged
的{{1}}事件。
答案 3 :(得分:0)
我不打扰静态字段......这种在表单之间来回传递值的问题已经被多次回答了......所以对this link我之前回答的问题是{{3}}。它甚至可以逐步创建两个表单,并通过getter / setter甚至事件来获取值来回传递。希望这会帮助你。