public string SelectedToClipboard() { if (SelectedTreeNode.Count == 0) { return(string.Empty); } var minLevel = int.MaxValue; var maxLevel = int.MinValue; foreach (var item in SelectedTreeNode) { if (minLevel > item.Level) { minLevel = item.Level; } if (maxLevel < item.Level) { maxLevel = item.Level; } } var buffer = new StringBuilder(); var sbHtml = new StringBuilder(); sbHtml.AppendLine(HTMLStyle.TableOpen); // Should follow display of nodes... foreach (var item in SelectedTreeNode) { var text = item.Text; sbHtml.Append(HTMLStyle.TROpen); // TreeData Tag is teh first column if (item.Tag is FormHierarchyDisplay.TreeData data) { text = data.Title; if (!string.IsNullOrEmpty(data.Tag)) { sbHtml.Append(HTMLStyle.AddTd("<td>{0}</td>", data.Tag)); buffer.Append(data.Tag); buffer.Append("\t"); if (text.StartsWith(data.Tag, StringComparison.Ordinal)) { text = text.Substring(data.Tag.Length).TrimStart(' ', '-'); } } else { sbHtml.Append(HTMLStyle.TDEmpty); } } // Depending on Level add columns for (var level = minLevel; level < item.Level; level++) { buffer.Append("\t"); sbHtml.Append(HTMLStyle.TDEmpty); } sbHtml.Append( HTMLStyle.AddTd( "<td colspan='{0}'>{1}</td>", ((maxLevel - item.Level) + 1).ToString(CultureInfo.InvariantCulture), text)); buffer.Append(text); for (var level = item.Level + 1; level < maxLevel; level++) { buffer.Append("\t"); } // TreeData Children Count is the last column if (item.Tag is FormHierarchyDisplay.TreeData data2) { sbHtml.Append(HTMLStyle.AddTd("<td>{0}</td>", data2.Children.Count)); buffer.Append(data2.Children.Count); } sbHtml.AppendLine(HTMLStyle.TRClose); buffer.AppendLine(); } sbHtml.AppendLine(HTMLStyle.TableClose); var dataObject = new DataObject(); dataObject.SetData(DataFormats.Html, true, HTMLStyle.ConvertToHtmlFragment(sbHtml.ToString())); dataObject.SetData(DataFormats.Text, true, buffer.ToString()); Clipboard.Clear(); Clipboard.SetDataObject(dataObject, false, 5, 200); return(buffer.ToString()); }
/// <summary> /// Copies all cells to the clipboard /// </summary> /// <param name="addErrorInfo">if set to <c>true</c> [add error information].</param> /// <param name="cutLength">if set to <c>true</c> [cut length].</param> /// <param name="alternatingRows">if set to <c>true</c> [alternating rows].</param> /// <param name="columns">The columns.</param> /// <param name="rows">The rows.</param> /// <param name="cancellationToken">The cancellation token.</param> private void CopyAllCellsIntoClipboard( bool addErrorInfo, bool cutLength, bool alternatingRows, [NotNull] DataGridViewColumnCollection columns, [NotNull] DataGridViewRowCollection rows, CancellationToken cancellationToken) { var buffer = new StringBuilder(); var sbHtml = new StringBuilder(m_HtmlStyle.TableOpen); sbHtml.Append(m_HtmlStyle.TROpenAlt); var first = true; var visibleColumns = new SortedDictionary <int, DataGridViewColumn>(); foreach (DataGridViewColumn c in columns) { // Do not include the error field it will be retrieved from the error collection with nice coloring if (c.Visible && c.HeaderText != ReaderConstants.cErrorField) { visibleColumns.Add(c.DisplayIndex, c); } } var hasRowError = HasRowErrors(0, rows.Count, rows); foreach (var col in visibleColumns.Values) { var headerText = col.HeaderText; sbHtml.Append(HTMLStyle.AddTd(m_HtmlStyle.TH, headerText)); if (!first) { buffer.Append('\t'); } else { first = false; } buffer.Append(EscapeTab(headerText)); } if (hasRowError && addErrorInfo) { sbHtml.Append(HTMLStyle.AddTd(m_HtmlStyle.TH, c_ErrorInfo)); buffer.Append('\t'); buffer.Append(c_ErrorInfo); } sbHtml.AppendLine(m_HtmlStyle.TRClose); buffer.AppendLine(); var trAlternate = false; var lastRefresh = DateTime.Now; for (var row = 0; row < rows.Count; row++) { if (rows[row].IsNewRow) { break; } sbHtml.Append(trAlternate ? m_HtmlStyle.TROpenAlt : m_HtmlStyle.TROpen); if (alternatingRows) { trAlternate = !trAlternate; } first = true; foreach (var col in visibleColumns.Values) { if (cancellationToken.IsCancellationRequested) { return; } var cell = rows[row].Cells[col.Index]; AddCell(cell, buffer, sbHtml, !first, addErrorInfo, cutLength, m_HtmlStyle); first = false; } AppendRowError(buffer, sbHtml, rows[row].ErrorText, addErrorInfo && hasRowError, m_HtmlStyle); sbHtml.AppendLine(m_HtmlStyle.TRClose); buffer.AppendLine(); if (!((DateTime.Now - lastRefresh).TotalSeconds > 0.2)) { continue; } lastRefresh = DateTime.Now; Extensions.ProcessUIElements(); } sbHtml.AppendLine(m_HtmlStyle.TableClose); var dataObject = new DataObject(); dataObject.SetData(DataFormats.Html, true, m_HtmlStyle.ConvertToHtmlFragment(sbHtml.ToString())); dataObject.SetData(DataFormats.Text, true, buffer.ToString()); dataObject.SetClipboard(); }