Добавить ContextMenuStrips для нескольких DataGridViews на нескольких вкладках

Я пытаюсь загрузить несколько DataTables в DataGridViews в отдельных вкладках TabControl, DataTables хранятся в словаре, который в свою очередь хранится в классе DataObject.

Я могу заставить все отображаться правильно, но когда я пытаюсь добавить цикл через заголовок Datagridview для добавления контекстного меню, по какой-то причине я могу заставить его работать для первого DataGridView, но к последующим DataGridView не применяется контекстное меню? Я попытался добавить состояние печати непосредственно перед циклом foreach, и DataGridView получает нулевое число столбцов... поэтому я предполагаю, что цикл foreach ничего не делает... но все данные по-прежнему правильно отображаются в dataGridViews в их соответствующих вкладки... любая помощь в указании того, что мне не хватает, будет принята с благодарностью.

С уважением Амарино

Код приведен ниже

List<ImportObject> lImportObjects = new List<ImportObject>();

private void loadImportFilesToScreen(List<ImportObject> lImportObjects)
{
    foreach (ImportObject lImportObject in lImportObjects) {
        DisplayImportFiles(lImportObject);
    }
}

public void DisplayImportFiles(ImportObject pImportObject)
{
    string lTabName="";
    //load DataGridView with DataTable
    /*
    foreach (KeyValuePair<string, DataTable> lDT in pImportObject.DataTableDictionary)
    {
        lTabName = DisplayTabsInApp(pImportObject.FileName + "_" + lDT.Key, lDT.Key);
        LoadDatatableIntoGrid(lDT.Value, lTabName);
    }
    */
    for (int i = 0; i < pImportObject.DataTableDictionary.Count; i++)
    {
        KeyValuePair<string, DataTable> lItem = pImportObject.DataTableDictionary.ElementAt(i);
        string lKey = lItem.Key;
        DataTable lDT = lItem.Value;
        lTabName = DisplayTabs(pImportObject.FileName + "_" + lKey, lKey);
        LoadDatatableIntoGrid(lDT, lTabName);
        lDT = null;
    }
}

public string DisplayTabs(string pTabName, string pSheetName)
{
    // Create a new Tab Page for this file. Set heading, set name.
    TabPage lTabPage_NewFile = new TabPage();
    lTabPage_NewFile.Text = pTabName;
    lTabPage_NewFile.Name = "TAB_PAGE_" + pTabName;
    tabControl_ImportFiles.TabPages.Add(lTabPage_NewFile);
    return lTabPage_NewFile.Name;
}

public void LoadDatatableIntoGrid(DataTable pDataTable, string pTabName) {
    DataGridView lDGV = new DataGridView();
    lDGV.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing;
    lDGV.RowHeadersVisible = false;

    BindingSource BindingSource1 = new BindingSource(); //create new data binding source
    BindingSource1.DataSource = pDataTable;             //SetData source
    lDGV.DataSource = BindingSource1;
    lDGV.RowHeadersVisible = true;

    tabControl_ImportFiles.TabPages[pTabName].Controls.Add(lDGV);
    //DataGridView lDGV = tabControl_ImportFiles.TabPages[pTabName].Controls[0] as DataGridView;
    PrintToConsoleInARD("DataGridView Column Count: " + lDGV.Columns.Count.ToString()); 
    bool runOnce = true; 
    foreach (DataGridViewColumn lDGVColumn in lDGV.Columns) {
        lDGVColumn.HeaderCell.ContextMenuStrip = lCMS_ColumnHeaders;
    }
    lDGV.Dock = DockStyle.Fill;
    lDGV.VirtualMode = true;
    BindingSource1 = null;
    lDGV = null;
}

1 ответ

Решение

Я уверен, что причина этого в том, что "закладка" не отображается. Как след описан внутри LoadDatatableIntoGrid метод... если вы поставите точку останова на линии...

tabControl_ImportFiles.TabPages[pTabName].Controls.Add(lDGV);

Добавить часы в переменную lDGV.Columns.Count… Покажет, что IDGV имеет ноль (0) столбцов. Выполните линию выше и волшебным образом, сетку IDGV имеет столбцы. Это выглядит правильно, поскольку это первая "закладка" и активная (отображаемая) закладка. Суть в том, что… если вы не добавите сетку на вкладку "Активно / Показано / Отображено", большая часть кода пользовательского интерфейса будет игнорироваться. Вот почему в следующий раз; Сетка будет пустой, поскольку сетка добавлена ​​на не активную / показанную / отображаемую вкладку.

Простое решение состоит в том, чтобы просто "показать" вкладку, прежде чем добавить к ней сетку. Похоже, это решает проблему, которую вы описываете. Добавьте строку ниже перед строкой выше...

tabControl_ImportFiles.TabPages[pTabName].Show();

Надеюсь это поможет.

Другие вопросы по тегам