0

我正在做一个非常复杂的项目,而且我对 windows 项目非常陌生。
我有 2 个表格:

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

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

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

表单 2 即Scheduler.cs是一个对话框表单。此处选择的日期ViewScheduler应显示在此处。

我需要帮助。

4

4 回答 4

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();
}
于 2012-11-01T21:26:01.233 回答
0

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

例子

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
}

调度程序.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

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

于 2012-11-01T21:42:24.620 回答
0

我不会为静态字段而烦恼...这种在表单之间来回传递值的问题已经回答了很多次...所以这个链接到我回答的上一个问题。它甚至一步一步地创建两个表单并通过 getter/setter 甚至事件来回传递值。希望这可以帮助你。

于 2012-11-02T00:32:41.163 回答
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的 s 中获取值的属性;Calendar再次确保OnPropertyChanged在基础日历值更改时触发。如果你正在使用MonthCalendar,你可以通过监听它的DateChanged事件来做到这一点。

然后,让您Scheduler将 aIFromToDateProvider作为构造函数参数并监听其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听到PropertyChangeda 的事件ViewSchedule

于 2012-11-01T23:41:47.143 回答