簡體   English   中英

將ContextMenuStrips添加到多個TabPages上的多個DataGridViews

[英]Add ContextMenuStrips to multiple DataGridViews on multiple TabPages

我試圖在TabControl的單獨選項卡頁中將多個DataTables加載到DataGridViews中,DataTables存儲在Dictionary中,而Dictionary又存儲在DataObject類中。

我可以正確顯示所有內容,但是當我嘗試通過Datagridview Header添加循環以添加contextmenustrip時,由於某種原因,我可以使它適用於第一個DataGridView,但是后續的DataGridViews沒有應用上下文菜單嗎? 我試過在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包含列。 這似乎是正確的,因為這是第一個“標簽頁”,並且它是活動的(顯示的)標簽頁。 要點...如果不將網格添加到“活動/顯示/顯示”選項卡頁面,則大多數UI代碼將被忽略。 這就是為什么下一次到來; 網格將為空,因為網格已添加到非“活動/顯示/顯示”標簽頁中。

一個簡單的解決方案是在向其添加網格之前簡單地“顯示”選項卡頁面。 這似乎可以解決您描述的問題。 在下面的行之前添加下面的行...

tabControl_ImportFiles.TabPages[pTabName].Show();

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM