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

时间:2012-11-01 21:22:52

标签: c# winforms

我正在开展一个非常复杂的项目,我对Windows项目非常陌生 我有2个表格:

  • ViewSchedule.cs
  • Scheduler.cs(这是一个对话形式)

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

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

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

我需要帮助。

4 个答案:

答案 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的值,以便触发事件。或者,您可以使FromTo计算属性只获取您提到的Calendar中的值;再次确保在基础日历值更改时触发OnPropertyChanged。如果您使用MonthCalendar,则可以通过收听DateChanged event来完成此操作。

然后,让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收听PropertyChanged的{​​{1}}事件。

答案 3 :(得分:0)

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