【问题标题】:Passing the selectionStart property (monthCalendar) between forms (winforms c#)在表单之间传递 selectionStart 属性(monthCalendar)(winforms c#)
【发布时间】:2023-03-09 21:20:01
【问题描述】:

我在一个表单 (statsform) 上有一个日历控件,我从另一个表单导出表单调用它:

这是我实例化 exportform 的 statsform 中的代码:

private void export_Click(object sender, EventArgs e)
        {

            if (formIsHidden == 0)
            {
                ExportForm exportForm = new ExportForm();
                exportForm.Show();
                formIsHidden = 1;
            }

        }

每次点击时,我都会在 statsform 中更新日历控件中的日期:

public void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e)
        {
            dateFromLabel.Text = dateFromCalendar.SelectionStart.ToString("dd/MM/yyyy");   
        }

        public void monthCalendar2_DateChanged(object sender, DateRangeEventArgs e)
        {
            dateToLabel.Text = dateToCalendar.SelectionStart.ToString("dd/MM/yyyy"); 
        }

这是来自form2的代码(试图获取 selectionStart 属性并使用它)

(On button click)

statsform statsform = new statsform();

string startDate = statsform.dateFromCalendar.SelectionStart.ToString("yyyy-MM-dd 00:00:00");
string endDate = statsform.dateToCalendar.SelectionStart.ToString("yyyy-MM-dd 23:59.00");

(Pass date to SQL Queries)

但是,选择的日期不会传递给 exportform,当我创建断点并检查字符串时,只会传递当前日期。

是因为我正在创建表单的新实例吗?如何将用户选择的日期从表单传递到第二个表单?

statsform(create Calendar) -> exportform(按钮点击事件 - 从 statsform 日历控件中检索 selectedDate)

我的解决方案:

public ExportForm(statsform parent)
        {
            InitializeComponent();
            statsform = parent;

        }

允许我使用表单的现有实例。我需要构造函数中的 (this),所以感谢所有帮助。

【问题讨论】:

  • 显然你并不是真的要使用new statsform()。那是一个新的表单对象,用户还没有看到它的日历。所以还不可能选择日期。使用现有实例,即用户正在查看的实例。如有必要,向表单添加一个字段以存储该实例,并使用其 FormClosed 事件将其设置回 null。
  • 如何使用form2中已有的实例?
  • 你太难帮你了,我在sn-p里只看到ExportForm和statsform。 “form1”和“form2”可能是什么尚不清楚。当类型与对象的概念仍然不清楚时,很难在 Winforms 中取得进展,它是无情的 OOPy。如果您不顾一切,请从 Application.OpenForms 中找到它。
  • 对不起。我只是使用名称“form 1”和“form 2”让事情变得更简单。我已经更新了代码。 Form 1 是 statsform,form2 是 exportform

标签: c# winforms monthcalendar


【解决方案1】:

您可以在实例化导出表单的构造函数时为其设置一个参数,以将引用传递给您的第一个表单,然后直接引用这些属性。

所以在你的导出表单的类中

private statsform _statsform = null;

public exportform(statsform caller) {
    _statsform = caller;
}

然后当你实例化它时

ExportForm exportForm = new ExportForm(this);

然后从您的按钮单击代码中引用您的 statsform 中的标签

var fromDate = _statsform.dateFromCalendar.... etc

更多关于构造函数的信息在这里 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/constructors

【讨论】:

  • 感谢您的解决方案。日历在表格 1 中,我想将选定的日期传递给表格 2,然后使用它。我有点理解您的解决方案,但您能否详细说明一下。对不起。
  • 如果我在 form1 的构造函数上设置该参数,然后在 form2 的按钮单击方法中实例化 form1,我传递的 startDate 是什么?因为日历控件在form1中。
  • 因此,您将在示例中的表格 2 中添加构造函数逻辑(我的解决方案顶部的位)。因此,在表单 1 中,您将有 2 个日历和一个按钮,在按钮单击方法上,您将创建一个新的 form2(startDate, endDate),startDate 和 endDate 将从您的 2 个日历控件中提取
  • 是的。当您创建一个新的 statsform 时,您正在创建该类的全新实例。可以打开相同表单的多个实例,每个实例具有相同的外观和逻辑,但每个实例包含不同的信息。将它们想象成您手机中的联系人条目,它们看起来都一样,但 John 和 Fred 是同一事物的两个不同实例......
  • ... 创建一个新的 statsform 就像创建一个新的联系人一样,因此您无法访问您已经打开的实例的信息。要完成这项工作,您需要传递对表单的引用。我假设你从你的 form1 打开你的 form2 是正确的吗?您能否在您的问题中放置一份创建并显示 form2 的代码副本?
猜你喜欢
  • 2011-03-05
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多