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