将 ContextMenuStrip 添加到多个 TabPage 上的多个 DataGridView

Add ContextMenuStrips to multiple DataGridViews on multiple TabPages

我正在尝试将多个 DataTable 加载到 TabControl 的单独标签页中的 DataGridView 中,DataTable 存储在字典中,字典又存储在 DataObject class 中。

我可以正确显示所有内容,但是当我尝试通过 Datagridview Header 添加循环以添加上下文菜单条时,出于某种原因,我可以让它在第一个 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;
}

我确信这是因为没有显示“标签页”。由于在 LoadDatatableIntoGrid 方法中描述了跟踪...如果您在该行放置断点...

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

向变量 lDGV.Columns.Count 添加监视...将显示 IDGV 具有零 (0) 列。执行上面的行,神奇地,网格 IDGV 有列。这看起来是正确的,因为这是第一个“标签页”并且它是活动的(显示的)标签页。要点是……如果您不将网格添加到“Active/Shown/Displayed”标签页,大多数 UI 代码将被忽略。这就是为什么下一次;网格将是空的,因为网格被添加到非“active/shown/displayed”标签页。

一个简单的解决方案是在添加网格之前简单地“显示”标签页。这似乎可以解决您描述的问题。在上面的行之前添加下面的行…

tabControl_ImportFiles.TabPages[pTabName].Show();

希望对您有所帮助。