[英]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.