Вопрос:

Передача значения даты из одной Windows From в другую форму в C #

c# winforms

1528 просмотра

4 ответа

19 Репутация автора

Я работаю над очень сложным проектом, и я очень новичок в Windows Project.
У меня есть 2 формы:

  • ViewSchedule.cs
  • Scheduler.cs (это диалоговая форма)

ViewSchedule.csимеет две даты для выбора из календаря. Две даты выбраны.
Они сохраняются в Resp:

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

Форма 2, то Scheduler.csесть является dialogForm. Здесь ViewSchedulerдолжны отображаться даты, выбранные в .

Мне нужна помощь.

Автор: user1141927 Источник Размещён: 01.11.2012 09:22

Ответы (4)


1 плюс

2266 Репутация автора

Вам необходимо создать открытые свойства в диалоговой форме и установить эти свойства перед отображением диалога.

Затем 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();
}
Автор: nilobarp Размещён: 01.11.2012 09:26

0 плюса

4908 Репутация автора

Самый простой способ - убедиться, что эти две переменные, которые определяют две даты, доступны 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которых я думаю, что вы хотели бы достичь

Спасибо,
надеюсь, вы найдете это полезным :)

Автор: Picrofo Software Размещён: 01.11.2012 09:42

0 плюса

33448 Репутация автора

Вы должны предоставить 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вами s; еще раз, убедитесь, что срабатывает 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слушаете PropertyChangedсобытие а ViewSchedule.

Автор: millimoose Размещён: 01.11.2012 11:41

0 плюса

39443 Репутация автора

Я не стал бы беспокоиться о статических полях ... На этот тип вопроса о передаче значений между формами многократно отвечали ... Так что это ссылка на предыдущий вопрос, на который я так ответил. В нем даже есть пошаговое руководство по созданию двух форм и получению значений, передаваемых взад-вперед через геттер / сеттер и даже события. Надеюсь, что это помогает вам.

Автор: DRapp Размещён: 02.11.2012 12:32
Вопросы из категории :
32x32