Подписаться на событие HandleCreated
и заполнить дерево в обработчике событий.
public partial class Form1 : Form
{
Form2 settingsWindow;
public Form1()
{
InitializeComponent();
}
private void SettingsWindow_HandleCreated(object sender, EventArgs e)
{
var dt1 = new SampleTable1();
var dt2 = new SampleTable2();
settingsWindow.FillTree(dt1, dt2);
}
private void button1_Click(object sender, EventArgs e)
{
settingsWindow = new Form2();
settingsWindow.HandleCreated += SettingsWindow_HandleCreated;
settingsWindow.ShowDialog();
}
}
В качестве бонуса мы также исправили пару проблем с методом FillTree
, поэтому дерево можно построить правильно.
public void FillTree(DataTable dtGroups, DataTable dtGroupsChilds)
{
treeViewGroups.Nodes.Clear();
if (dtGroups == null) return;
foreach (DataRow rowGroup in dtGroups.Rows)
{
parentNode = new TreeNode
{
Text = rowGroup["Groupname"].ToString(),
Tag = rowGroup["Groupid"]
};
treeViewGroups.Invoke(new Add(AddParent), new object[] { parentNode });
if (dtGroupsChilds == null) continue;
foreach (DataRow rowUser in dtGroupsChilds.Rows)
{
if ((int)rowGroup["Groupid"] == (int)rowUser["Groupid"])
{
TreeNode childNode = new TreeNode
{
Text = rowUser["Username"].ToString(),
Tag = rowUser["Phone"]
};
treeViewGroups.Invoke(new Add(AddChild), new object[] { childNode });
//System.Threading.Thread.Sleep(1000);
}
}
}
treeViewGroups.Update();
}
Отвечая на ваш дополнительный вопрос: , если Form2
уже виден, исключение, о котором вы сообщили, не произойдет, потому что в этот момент был создан дескриптор окна, как мы покажем ниже.
public partial class Form1 : Form
{
Form2 settingsWindow;
SampleTable1 dt1;
SampleTable2 dt2;
int groupid = 1;
int userid = 101;
public Form1()
{
InitializeComponent();
dt1 = new SampleTable1();
dt2 = new SampleTable2();
dt1.AddGroup(groupid);
dt2.AddUser(groupid, userid++);
dt2.AddUser(groupid, userid++);
dt1.AddGroup(++groupid);
dt2.AddUser(groupid, userid++);
dt2.AddUser(groupid, userid++);
dt2.AddUser(groupid, userid++);
}
private void SettingsWindow_HandleCreated(object sender, EventArgs e)
{
settingsWindow.FillTree(dt1, dt2);
}
private void button1_Click(object sender, EventArgs e)
{
settingsWindow = new Form2(this);
settingsWindow.HandleCreated += SettingsWindow_HandleCreated;
settingsWindow.ShowDialog();
}
public void UpdateData(string groupname)
{
dt1.AddGroup(++groupid, groupname);
dt2.AddUser(groupid, userid++);
dt2.AddUser(groupid, userid++);
settingsWindow.FillTree(dt1, dt2);
}
}
Form2
остается прежним, просто добавив обработчик событий для новой кнопки:
private void button1_Click(object sender, EventArgs e)
{
form1.UpdateData(textBox1.Text);
}
Отвечая на второй вопрос: UpdateData
был создан для конкретного случая использования пользователем, отправляющим новую группу через Form2
. Я бы предпочел иметь конкретный код для другого варианта использования. Обратите внимание, что было бы довольно элементарно иметь UpdateData
, чтобы консультироваться с сервером, или даже лучше, с некоторым абстрактным интерфейсом, который мог бы быть на удаленном сервере или нет (хороший дизайн требует, чтобы это было неактуально / прозрачно ...) а затем вернуть строковое сообщение, которое будет представлено в Form2. Однако это не добавит понимания целей ограниченного объема этого образца. Это на самом деле затуманило бы проблему корня, о которой вы сообщаете, и соответствующее решение. Давайте не будем забывать, что без этого сообщение об исключении в вашем исходном вопросе вернется прямо к вам ...: O)