Добавить 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();
Надеюсь это поможет.