private void Menu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) //Obtiene la opción del menú secundario al que se accedió { // TODO: Arreglar bug de click derecho en columnas switch (e.ClickedItem.Name) //Dependiendo el elemento al que se hizo click { case "Del": int mouseOverColumn = XMLDataGridView.HitTest(columnClicked.X, columnClicked.Y).ColumnIndex - 2; //Ïndice de la columna string colToDel = XMLDataGridView.Columns[mouseOverColumn].HeaderText; //Nombre de la columna a eliminar int index = ColumnasCheckedListBox.Items.IndexOf(colToDel); //Índice de la columna ColumnasCheckedListBox.SetItemChecked(index, false); //Desactivar del checkedList //MessageBox.Show(columnClicked.X.ToString() + " " + columnClicked.Y.ToString() + "\n" + Cursor.Position.X + " " + Cursor.Position.Y); //Log-debug XMLDataGridView.Columns[mouseOverColumn].Visible = false; //Oculta columna del grid break; } }
// *** EVENTOS *** \\\ void XMLDG_ColumnHeaderMouseClick(object sender, MouseEventArgs e) //Muestra un menú secundario { if (e.Button == MouseButtons.Right) //Al hacer click derecho { ContextMenuStrip menu = new ContextMenuStrip(); //Menú secundario menu.Items.Add("Ocultar columna").Name = "Del"; //Opciones del menú secundario //Guarda la localización del puntero con respecto al programa 8, 30 es el tamaño del cursor columnClicked.X = Cursor.Position.X - this.Location.X - 8; columnClicked.Y = Cursor.Position.Y - this.Location.Y - 30; int mouseOverColumn = XMLDataGridView.HitTest(columnClicked.X, columnClicked.Y).ColumnIndex - 2; //Índice de la columna que recibió el click //MessageBox.Show(XMLDataGridView.HitTest(columnClicked.X, columnClicked.Y).ToString()); //Pequeño Log-debug if (mouseOverColumn > 0) //Si existe la columna { menu.Show(this, columnClicked); //Muestra el menú secundario menu.ItemClicked += Menu_ItemClicked; //Evento que se ejecuta al hacer click en un elemento del menú secundario } } }
private void ExportGridFast() //Exporta el grid rápidamente a un archivo de excel (experimental) { // TODO: Ajustar ancho de columnas, eliminar la columna A de excel (está vacía) SaveFileDialog sfd = new SaveFileDialog { Filter = "Excel (*.xlsx)|*.xlsx", FileName = OutFileNameTextBox.Text + ".xlsx", Title = "Guardar como archivo de excel", DefaultExt = ".xlsx", ValidateNames = true }; if (sfd.ShowDialog() == DialogResult.OK) { XMLDataGridView.SelectAll(); DataObject dataObj = XMLDataGridView.GetClipboardContent(); if (dataObj != null) { Clipboard.SetDataObject(dataObj); } Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing); Microsoft.Office.Interop.Excel._Worksheet worksheet = null; object misValue = System.Reflection.Missing.Value; try { app.Visible = false; worksheet = workbook.Sheets[1]; worksheet = workbook.ActiveSheet; List <DataGridViewColumn> listVisible = new List <DataGridViewColumn>(); foreach (DataGridViewColumn col in XMLDataGridView.Columns) { if (col.Visible) { listVisible.Add(col); } } for (int i = 0; i < listVisible.Count; i++) { worksheet.Cells[1, i + 2] = listVisible[i].HeaderText; ExportProgressBar.PerformStep(); } app.Visible = false; worksheet = workbook.Sheets[1]; worksheet = workbook.ActiveSheet; Microsoft.Office.Interop.Excel.Range CR = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[2, 1]; CR.Select(); worksheet.PasteSpecial(CR, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, true); worksheet.Columns["A"].Delete(); worksheet.Columns.AutoFit(); ExportProgressBar.Value = ExportProgressBar.Maximum; MessageBox.Show("El archivo fue exportado con éxito.", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information); if (File.Exists(sfd.FileName)) { try { File.Delete(sfd.FileName); //Elimina el archivo existente } catch (IOException ex) { MessageBox.Show("No fue posible eliminar el archivo anterior. " + ex.Message); return; } } if (MessageBox.Show("¿Deseas abrir el archivo generado?", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { workbook.SaveAs(sfd.FileName); workbook.Saved = true; app.Visible = true; } else { workbook.SaveAs(sfd.FileName); workbook.Saved = true; workbook.Close(false); } } catch (Exception e) { workbook.Close(false); MessageBox.Show(e.Message); } XMLDataGridView.ClearSelection(); } }