Код C# (метод) запускается, когда приложение закрыто
У меня есть кнопка, которая при нажатии закрывает текущую форму и открывает новую форму того же класса - то есть она открывает новую форму в исходном состоянии.
У меня есть другая кнопка с той же функциональностью, однако я пытаюсь вызвать функцию в коде, чтобы при открытии новой формы она выполнялась 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();
}
2 ответа
Я думаю, что метод, который вы имеете в виду ниже:
private void clearAndImport()
{
this.Hide();
Dashboard dashboard = new Dashboard();
dashboard.ShowDialog();
dashboard.importGantt();
this.Close();
}
Ты звонишь dashboard.ShowDialog()
, Итак, пока вы не закроете форму "Панель инструментов", следующая строка кода (dashboard.importGantt()
) не позвонят. Я предлагаю вам позвонить importGantt()
в конструкторе или событии Load формы Dashboard. Вы также можете изменить последовательность кода, переместив 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();
}
}
Пытаться 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...
}