0

我有一个按钮,按下该按钮会关闭当前表单并打开同一类的新表单 - 即它会以原始状态打开一个新表单。

我有另一个具有相同功能的按钮,但是我尝试在代码中调用一个函数,因此当新表单打开时,它会运行表单importGantt()的一个函数。

importGantt()我遇到的问题是,当我单击按钮时,它会按预期关闭当前表单并打开一个新表单,但是在我关闭应用程序之前它不会调用该函数。

有任何想法吗?

非常感激。

private void browseFileToolStripMenuItem_Click(object sender, EventArgs e)
    {
        clearAndImport();
    }

private void clearAndImport()
    {
        this.Hide();
        Dashboard dashboard = new Dashboard();
        dashboard.ShowDialog();
        dashboard.importGantt();
        this.Close();
    }

private void importGantt()
    {
        // Edit Interface
        btnImport.Visible = false;
        dataCapPlan.Visible = true;
        dataMilestones.Visible = true;
        pnlGantt.Visible = true;
        Graphics ganttGraphics = pnlGantt.CreateGraphics();

        // Draw axis


        // Import Files
        fileCapPlan.Title = "Select Capital Plan File";
        fileCapPlan.Filter = "Excel Workbook (.xlsx)|*.xlsx";
        DialogResult resCapPlan = fileCapPlan.ShowDialog();
        if (resCapPlan == DialogResult.OK)
        {
            cnStr = cnStr + fileCapPlan.FileName;
        }
        else
        {
            MessageBox.Show("Error: Unable to import file");
        }
        fileMilestones.Title = "Select Milestones File";
        fileMilestones.Filter = "Excel Workbook (.xlsx)|*.xlsx";
        DialogResult resMilestones = fileMilestones.ShowDialog();
        if (resMilestones == DialogResult.OK)
        {
            cnStr2 = cnStr2 + fileMilestones.FileName;
        }
        else
        {
            MessageBox.Show("Error: Unable to import file");
        }

        // Use OleDb connection to import Excel data
        using (OleDbConnection cn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + cnStr + ";Extended Properties=" + "'EXCEL 12.0 Xml;HDR=YES'"))
        {
            using (OleDbDataAdapter adapter = new OleDbDataAdapter(sqlSelectAll, cn))
            {
                adapter.Fill(dtCapPlan);
                dataCapPlan.DataSource = dtCapPlan;
                dataCapPlan.AutoResizeColumns();
            }
        }
        using (OleDbConnection cn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + cnStr2 + ";Extended Properties=" + "'EXCEL 12.0 Xml;HDR=YES'"))
        {
            using (OleDbDataAdapter adapter = new OleDbDataAdapter(sqlSelectAll, cn))
            {
                adapter.Fill(dtMilestones);
                dataMilestones.DataSource = dtMilestones;
                dataMilestones.AutoResizeColumns();
            }
        }

        // Draw Gantt Chart
        foreach (DataRow rowCapPlan in dtCapPlan.Rows)
        {
            id = rowCapPlan["Program ID"].ToString();

            foreach (DataRow rowMilestone in dtMilestones.Rows)
            {
                if (id == rowMilestone["Program ID"].ToString())
                {
                    // calculate space in days from todays date and the milestone date
                    msDate = Convert.ToDateTime(rowMilestone["Milestone Date"]);
                    msTimespan = msDate - calDate;
                    msIntDate = (int)msTimespan.TotalDays + 1;
                    tTimespan = tDate - calDate;
                    tIntDate = (int)tTimespan.TotalDays + 1;
                    ganttPlotSpace = msIntDate - tIntDate;

                    // Draw each milestone or gateway which is not yet complete
                    if (rowMilestone["% Complete"].ToString() != "100")
                    {
                        taskname = rowMilestone["Task Name"].ToString();
                        if (taskname == "Gateway 1" || taskname == "Gateway 2" || taskname == "Gateway 3" || taskname == "Gateway 4" || taskname == "Gateway 5")
                        {
                            Rectangle gw = new Rectangle(startx + ganttPlotSpace, starty - 4, 2, 11);
                            ganttGraphics.DrawRectangle(gwPen, gw);
                            ganttGraphics.FillRectangle(gwBrush, gw);
                        }
                        else
                        {
                            Rectangle ms = new Rectangle(startx + ganttPlotSpace + 1, starty, 2, 2);
                            ganttGraphics.DrawRectangle(msPen, ms);
                            ganttGraphics.FillRectangle(msBrush, ms);
                        }
                        ganttGraphics.DrawLine(linePen, startx - 10, starty - 11, pnlGantt.Right, starty - 11);
                    }
                }
            }
            starty = starty + 22;
        }
        ganttGraphics.DrawLine(linePen, startx - 10, starty + 11, pnlGantt.Right, starty + 11);
    }

带有甘特图的图像 在此处输入图像描述

clearAndImport 方法后的图像(由用户修复) 在此处输入图像描述


根据 Brij 指导:

好的,所以在指导下这几乎可以工作,代码现在如下......

现在这会打开新表单并运行导入方法,但是,它似乎是在循环运行它。即它运行成功显示甘特图,但随后尝试再次运行导入甘特图方法。

bool clear;



public Dashboard(bool clear = false)
    {
        InitializeComponent();
        dataCapPlan.ColumnHeaderMouseClick += new DataGridViewCellMouseEventHandler(dataCapPlan_ColumnHeaderMouseClick);

        this.clear = clear;
        this.Load += new EventHandler(Dashboard_Load);
    }
    private void Dashboard_Load(object sender, EventArgs e)
    {
        if (this.clear)
        {
            this.importGantt();
        }
    }

// Clear and import method
    private void clearAndImport()
    {
        this.Hide();
        Dashboard dashboard = new Dashboard();
        dashboard.clear = true;
        dashboard.ShowDialog();
        this.Close();
    }
4

2 回答 2

1

我认为您所指的方法如下:

private void clearAndImport()
{
        this.Hide();
        Dashboard dashboard = new Dashboard();
        dashboard.ShowDialog();
        dashboard.importGantt();
        this.Close();
}

你在打电话dashboard.ShowDialog()dashboard.importGantt()因此,在您关闭“仪表板”表单之前,不会调用下一行代码 ( )。我建议您调用importGantt()Dashboard 表单的构造函数或 Load 事件。dashboard.importGantt(您也可以通过移动上面的 )来更改代码的顺序dashboard.ShowDialog()


根据您的评论,我建议修改Dashboard类的构造函数以接受布尔参数并使其可选(默认为 false)。如果通过了 true,则只调用 importGantt()。所以它会像:

public Dashboard(bool clear = false)
{
   InitializeComponent();
   if(clear)
   {
       this.importGantt();
   }
}

你的clearAndImport()方法就像:

private void clearAndImport()
{
        this.Hide();
        Dashboard dashboard = new Dashboard(true);
        dashboard.ShowDialog();
        this.Close();
}

根据我最后的评论,试试这个:

bool clear = false;
public Dashboard(bool clear = false)
{
        InitializeComponent();
        this.clear = clear;
        this.Load += new EventHandler(Dashboard_Load);
}

void Dashboard_Load(object sender, EventArgs)
{
    if(this.clear)
    {
       this.importGantt();
    }
}
于 2013-04-05T11:44:34.857 回答
0

尝试dashboard.Show();代替dashboard.ShowDialog();

using (var dashboard = new Dashboard())
{
    dashboard.Show(); // Show the form
    dashboard.importGantt(); // Call
    dashboard.Close(); // Close it when you're done...
} 
于 2013-04-05T11:43:08.030 回答