У меня есть форма, которую я вызываю из другой формы.Я поместил весь код инициализации в конструктор, чтобы из события Form_Load ничего не вызывалось.Я прошел через код инициализации, который заполняет 8 ComboBox из DataSet, который уже был загружен в исходной форме.Независимо от того, что я делаю, вызов Form.Show()
или Form.ShowDialog()
занимает вечность - не менее 15 секунд, иногда больше.Это неприемлемо для типа выполняемой операции;пользователи никогда не будут в порядке с этим.
private void ContextMenuItem_Click(object sender, EventArgs e)
{
ToolStripItem mui = sender as ToolStripItem;
frmAddDataFieldMapping frm = null;
switch(mui.Name) {
case "muiAddSourceDataFieldMapping":
frm = new frmAddDataFieldMapping(this, ((NodeInfo)tvwMain.SelectedNode.Tag), DataFieldMappingTypes.Source);
break;
case "muiAddDestinationDataFieldMapping":
frm = new frmAddDataFieldMapping(this, ((NodeInfo)tvwMain.SelectedNode.Tag), DataFieldMappingTypes.Destination);
break;
}
frm.Show();
}
public frmAddDataFieldMapping(frmMain _frm, frmMain.NodeInfo _ni, frmMain.DataFieldMappingTypes _dfmt)
{
InitializeComponent();
frm = _frm;
ni = _ni;
dfmt = _dfmt;
if(ni.NodeType == frmMain.NodeTypes.DataField)
{
PopulateComboBoxes();
SetupComboBoxFilters();
}
}
private void PopulateComboBoxes()
{
int parentSelectedId = 0;
if(dfmt == frmMain.DataFieldMappingTypes.Source)
{
parentSelectedId = PopulateComboBox(cboSourceDataField, new CboInfo(ni.NodeType, frmMain.DataFieldMappingTypes.Source), ni.Id);
parentSelectedId = PopulateComboBox(cboSourceDataSet, new CboInfo(frmMain.NodeTypes.DataSet,
frmMain.DataFieldMappingTypes.Source), parentSelectedId);
parentSelectedId = PopulateComboBox(cboSourceDataSource, new CboInfo(frmMain.NodeTypes.DataSource,
frmMain.DataFieldMappingTypes.Source), parentSelectedId);
parentSelectedId = PopulateComboBox(cboSourceDataSourceType, new CboInfo(frmMain.NodeTypes.DataSourceType,
frmMain.DataFieldMappingTypes.Source), parentSelectedId);
PopulateComboBox(cboDestinationDataField, new CboInfo(frmMain.NodeTypes.DataField, frmMain.DataFieldMappingTypes.Destination));
PopulateComboBox(cboDestinationDataSet, new CboInfo(frmMain.NodeTypes.DataSet, frmMain.DataFieldMappingTypes.Destination));
PopulateComboBox(cboDestinationDataSource, new CboInfo(frmMain.NodeTypes.DataSource, frmMain.DataFieldMappingTypes.Destination));
PopulateComboBox(cboDestinationDataSourceType, new CboInfo(frmMain.NodeTypes.DataSourceType, frmMain.DataFieldMappingTypes.Destination));
} else
{
parentSelectedId = PopulateComboBox(cboDestinationDataField, new CboInfo(ni.NodeType, frmMain.DataFieldMappingTypes.Destination), ni.Id);
parentSelectedId = PopulateComboBox(cboDestinationDataSet, new CboInfo(frmMain.NodeTypes.DataSet,
frmMain.DataFieldMappingTypes.Destination), parentSelectedId);
parentSelectedId = PopulateComboBox(cboDestinationDataSource, new CboInfo(frmMain.NodeTypes.DataSource,
frmMain.DataFieldMappingTypes.Destination), parentSelectedId);
parentSelectedId = PopulateComboBox(cboDestinationDataSourceType, new CboInfo(frmMain.NodeTypes.DataSourceType,
frmMain.DataFieldMappingTypes.Destination), parentSelectedId);
PopulateComboBox(cboSourceDataField, new CboInfo(frmMain.NodeTypes.DataField, frmMain.DataFieldMappingTypes.Source));
PopulateComboBox(cboSourceDataSet, new CboInfo(frmMain.NodeTypes.DataSet, frmMain.DataFieldMappingTypes.Source));
PopulateComboBox(cboSourceDataSource, new CboInfo(frmMain.NodeTypes.DataSource, frmMain.DataFieldMappingTypes.Source));
PopulateComboBox(cboSourceDataSourceType, new CboInfo(frmMain.NodeTypes.DataSourceType, frmMain.DataFieldMappingTypes.Source));
}
}
private int PopulateComboBox(ComboBox cbo, CboInfo info, int selectedId = 0)
{
int parentSelectedId = 0;
if(selectedId > 0)
{
DataRow[] rows = frm.ds.Tables[info.NodeType.ToString()].Select(frmMain.GetIdField(info.NodeType) + " = " + selectedId.ToString());
parentSelectedId = (int)rows[0][frmMain.GetIdField(frmMain.GetParentNodeType(info.NodeType))];
}
cbo.DataSource = new DataView(frm.ds.Tables[info.NodeType.ToString()]);
cbo.ValueMember = frmMain.GetIdField(info.NodeType);
cbo.DisplayMember = frmMain.GetNameField(info.NodeType);
cbo.BindingContext = this.BindingContext;
cbo.Tag = info;
if(selectedId > 0)
{
cbo.Enabled = false;
cbo.SelectedValue = selectedId;
}
return parentSelectedId;
}