2012-11-01 44 views
0

我正在处理一个非常复杂的项目,我对windows项目非常陌生。
我有2种形式:将日期值从一个窗口传递到C中的另一个窗体#

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

ViewSchedule.cs必须被从日历中选择的两个日期。选择两个日期。
它们被保存在RESP:

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

表2即Scheduler.cs是dialogForm。这里应该显示在ViewScheduler中选择的日期。

我需要帮助。

+2

“我需要帮助”不是一个有效的问题。我几次重新阅读您的文章,仍然无法找到问题。 – LightStriker

+0

如果我必须假设你说你想从form1访问一些数据并在form2中显示它?我对么 ? – pordi

+0

是的,Form1日期值应出现在Form2中。 – user1141927

回答

1

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

然后onLoad使用这些属性值。

在窗口2添加这些日期属性:

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(); 
} 
+0

你能解释一下怎么做? – user1141927

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我认为这是你想实现

感谢什么,
我希望对您有所帮助:)

+0

谢谢你会试试这个 – user1141927

+0

认真吗?一个计时器和一个脏标志来轮询一个全局变量?当然,这可以用不太笨重的方式完成。 – millimoose

+0

@millimoose我试图提供最简单的方法来做到这一点。当然,这可以通过许多其他方式来完成。据我所知,这是最简单的方法。请注意你的语言。有一个美好的一天:) –

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)); 
     } 
    } 
} 

请务必及时更新的值,从和使用性能,因此事件被解雇。或者,您可以制作FromTo计算出的属性,以获取您提到的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后收听该事件。如果两者都不相同,只需将其设置为属性;主要部分是你最终收到SchedulerPropertyChanged事件ViewSchedule

0

我不会打扰静态字段...这种类型的值之间传递值的问题已经被回答了很多次......所以对于前面的问题,我回答了this link。它甚至可以一步一步地创建两个表单,并通过getter/setter和事件来回传递值。希望这可以帮助你。

相关问题