// 插入本Line到某行。调用前,table.RowCount已经增量 // parameters: // nRow 从0开始计数 internal void InsertToTable(TableLayoutPanel table, int nRow) { this.Container.DisableUpdate(); try { Debug.Assert(table.RowCount == this.Container.Items.Count + 3, ""); List<Control> hidden_controls = new List<Control>(); // 先移动后方的 int nEnd = Math.Min(table.RowCount - 1 - 1, this.Container.Items.Count - 1); for (int i = nEnd; i >= nRow; i--) { // EasyLine line = this.Container.Items[i]; for (int j = 0; j < table.ColumnStyles.Count; j++) { Debug.Assert(i + EasyMarcControl.RESERVE_LINES + 1 < table.RowStyles.Count, ""); Control control = table.GetAnyControlAt(j, i + EasyMarcControl.RESERVE_LINES); if (control != null) { if (control.Visible == false) { control.Visible = true; hidden_controls.Add(control); } table.Controls.Remove(control); // Add 对于插入 Visible = false 的 Control 有问题。 // 为了避免问题,对这样的 Control 先显示,插入,最后再恢复为隐藏状态 table.Controls.Add(control, j, i + EasyMarcControl.RESERVE_LINES + 1); } else { Debug.Assert(false, ""); } } } table.Controls.Add(this.label_color, 0, nRow + EasyMarcControl.RESERVE_LINES); table.Controls.Add(this.label_caption, 1, nRow + EasyMarcControl.RESERVE_LINES); if (this.splitter != null) table.Controls.Add(this.splitter, 2, nRow + EasyMarcControl.RESERVE_LINES); if (this.textBox_content.Visible == false) { this.textBox_content.Visible = true; hidden_controls.Add(this.textBox_content); } // 插入前,这里应该没有 Control { // 这一句话必须有,不然会出现 BUG Control temp = table.GetAnyControlAt(3, nRow + EasyMarcControl.RESERVE_LINES); Debug.Assert(temp == null, ""); } table.Controls.Add(this.textBox_content, 3, nRow + EasyMarcControl.RESERVE_LINES); #if NO #if DEBUG // 插入后,这里应该有 Control { Control temp = table.GetAnyControlAt(3, nRow + EasyMarcControl.RESERVE_LINES); Debug.Assert(temp != null, ""); } #endif #endif foreach (Control control in hidden_controls) { control.Visible = false; } #if NO #if DEBUG // 恢复隐藏后,这里应该有 Control { Control temp = table.GetAnyControlAt(3, nRow + EasyMarcControl.RESERVE_LINES); Debug.Assert(temp != null, ""); } #endif #endif } finally { this.Container.EnableUpdate(); } // events AddEvents(true); }
// 从tablelayoutpanel中移除本Item涉及的控件 // parameters: // nRow 从0开始计数 internal void RemoveFromTable(TableLayoutPanel table, int nRow) { this.Container.DisableUpdate(); try { List<Control> hidden_controls = new List<Control>(); // 移除本行相关的控件 table.Controls.Remove(this.label_color); table.Controls.Remove(this.label_caption); if (this.splitter != null) table.Controls.Remove(this.splitter); table.Controls.Remove(this.textBox_content); Debug.Assert(this.Container.Items.Count == table.RowCount - 2, ""); // 然后压缩后方的 int nEnd = Math.Min(table.RowCount - 1 - 1, this.Container.Items.Count - 1); for (int i = nRow; i < nEnd; i++) { for (int j = 0; j < table.ColumnStyles.Count; j++) { Debug.Assert(i + EasyMarcControl.RESERVE_LINES + 1 < table.RowStyles.Count, ""); // Control control = table.GetControlFromPosition(j, i + EasyMarcControl.RESERVE_LINES + 1); Control control = table.GetAnyControlAt(j, i + EasyMarcControl.RESERVE_LINES + 1); if (control != null) { if (control.Visible == false) { control.Visible = true; hidden_controls.Add(control); } table.Controls.Remove(control); // Add 对于插入 Visible = false 的 Control 有问题。 // 为了避免问题,对这样的 Control 先显示,插入,最后再恢复为隐藏状态 table.Controls.Add(control, j, i + EasyMarcControl.RESERVE_LINES); } else { Debug.Assert(false, ""); } } } table.RowCount--; table.RowStyles.RemoveAt(nRow); foreach (Control control in hidden_controls) { control.Visible = false; } } finally { this.Container.EnableUpdate(); } }