C # - вызов метода Form.Show () очень медленно - PullRequest
0 голосов
/ 04 июня 2019

У меня есть форма, которую я вызываю из другой формы.Я поместил весь код инициализации в конструктор, чтобы из события 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;
        }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...