using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Linq; using System.Windows.Forms; namespace GeoSigma.UCDraw.WellAndSection { public partial class FrmWellDataEdit : CResizeForm { public string[] mEnColNames; //英文列名称 public string[] mColsName; public DataTable mDatas; public DataTable originDatas; public string strJsonData = ""; public bool m_IsModified = false; public FrmWellDataEdit() { InitializeComponent(); _designSize = new Size(this.Size.Width, this.Size.Height); StoreOriginalStates(this.Controls); mColsName = new string[0]; mDatas = new DataTable(); WellDataGridView.EnableHeadersVisualStyles = false; WellDataGridView.ColumnHeadersDefaultCellStyle.BackColor = Color.AliceBlue; WellDataGridView.RowHeadersDefaultCellStyle.BackColor = Color.Azure; WellDataGridView.ContextMenuStrip = this.ctmMenuWellTrackData; } void CurrentDataTable_DeleteRow(object sender, DataRowChangeEventArgs e) { m_IsModified = true; } void CurrentDataTable_RowChanged(object sender, DataRowChangeEventArgs e) { if (e.Action == DataRowAction.Change) { m_IsModified = true; } } void CurrentDataTable_RowModified(object sender, DataRowChangeEventArgs e) { m_IsModified = true; } void CurrentDataTable_TableNewRow(object sender, DataTableNewRowEventArgs e) { m_IsModified = true; } public void SetData(string[] colNames, string[] colNamesCH, string[,] datas) { mDatas.Clear(); mEnColNames = new string[colNames.Length]; for (int i = 0; i < colNames.Length; i++) { mEnColNames[i] = colNames[i]; } for (int i = 0; i < colNamesCH.Length; i++) { DataColumn col = new DataColumn(colNamesCH[i], typeof(string)); mDatas.Columns.Add(col); } for (int i = 0; i < datas.GetLength(0); i++) { DataRow dr = mDatas.NewRow(); for (int j = 0; j < datas.GetLength(1); j++) { dr[j] = datas[i, j]; } mDatas.Rows.Add(dr); } mDatas.RowChanged += CurrentDataTable_RowChanged; mDatas.RowDeleted += CurrentDataTable_RowModified; mDatas.TableNewRow += CurrentDataTable_TableNewRow; mDatas.RowDeleted += CurrentDataTable_DeleteRow; originDatas = mDatas; } private void FrmWellDataEdit_Shown(object sender, EventArgs e) { WellDataGridView.DataSource = mDatas.DefaultView; } private void FrmWellDataEdit_Load(object sender, EventArgs e) { } private void FrmWellDataEdit_FormClosed(object sender, FormClosedEventArgs e) { //DataTable changes = mDatas.GetChanges(); //if(changes != null) //{ // //foreach( DataRow row in changes.Rows) // //{ // // if(row.RowState == DataRowState.Deleted) // // { // // m_IsModified = true; // // } // // else if( row.RowState == DataRowState.Modified) // // { // // m_IsModified = true; // // } // // else if( row.RowState == DataRowState.Added) // // { // // m_IsModified = true; // // } // //} //} } private void FrmWellDataEdit_FormClosing(object sender, FormClosingEventArgs e) { } private void BtnAddRow_Click(object sender, EventArgs e) { DataRow newRow = mDatas.NewRow(); mDatas.Rows.Add(newRow); WellDataGridView.Refresh(); int lastRow = WellDataGridView.RowCount - 1; WellDataGridView.FirstDisplayedScrollingRowIndex = lastRow; } private void BtnDelRow_Click(object sender, EventArgs e) { if (WellDataGridView.SelectedRows == null || WellDataGridView.SelectedRows.Count == 0) { MessageBox.Show("请先选择需要删除的数据行"); } else { List rowsToDelete = new List(); foreach (DataGridViewRow row in WellDataGridView.SelectedRows) { if (row.IsNewRow) continue; DataRowView rowView = (DataRowView)row.DataBoundItem; rowsToDelete.Add(rowView.Row); } foreach (DataRow row in rowsToDelete) { mDatas.Rows.Remove(row); } WellDataGridView.Refresh(); // m_IsModified = true; } } private void RemoveEmptyRows(DataTable dataTable) { List rowsToRemove = new List(); foreach (DataRow row in dataTable.Rows) { bool isEmpty = true; foreach (DataColumn col in dataTable.Columns) { // 跳过自动生成的列(例如表达式列或自增列)可选 // if (col.AutoIncrement || col.Expression != null) continue; object value = row[col]; if (value != null && value != DBNull.Value && !string.IsNullOrWhiteSpace(value.ToString())) { isEmpty = false; break; } } if (isEmpty) { rowsToRemove.Add(row); } } // 从 DataTable 中移除空行(必须在循环外删除,防止枚举修改异常) foreach (DataRow row in rowsToRemove) { row.Delete(); // 使用 Delete 而不是 Remove,以正确维护状态(尤其用于DataAdapter更新) } // 提交更改(可选,但建议) dataTable.AcceptChanges(); } private void BtnOk_Click(object sender, EventArgs e) { RemoveEmptyRows(mDatas); JObject tjson = new JObject(); JArray jsonColName = new JArray(); for (int ii = 0; ii < mEnColNames.Length; ii++) { jsonColName.Add(mEnColNames[ii]); } tjson["columnName"] = jsonColName; JArray jsonData = new JArray(); for (int ii = 0; ii < mDatas.Rows.Count; ii++) { DataRow rw = mDatas.Rows[ii]; JArray jRow = new JArray(); for (int jj = 0; jj < mEnColNames.Length; jj++) { jRow.Add(rw[jj].ToString()); } jsonData.Add(jRow); } tjson["data"] = jsonData; strJsonData = JsonConvert.SerializeObject(tjson); } private void PasteMenuItemWellDataDlg_Click(object sender, EventArgs e) { try { string clipText = Clipboard.GetText(); if (string.IsNullOrEmpty(clipText)) return; int maxselId = GetMaxSelectedRowIndex(WellDataGridView); if (maxselId == -1) maxselId = 0; string[] rows = clipText.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < rows.Length; i++) { string tstr = rows[i]; tstr = tstr.TrimStart(); string[] values = tstr.Split(new[] { "\t", " ", ",", ";" }, StringSplitOptions.None); int rcol = mDatas.Columns.Count; if (rcol > values.Length) rcol = values.Length; DataRow newRow = mDatas.NewRow(); for (int j = 0; j < rcol; j++) newRow[j] = values[j]; mDatas.Rows.InsertAt(newRow, maxselId); maxselId++; } m_IsModified = true; WellDataGridView.Refresh(); } catch (Exception ex) { MessageBox.Show($"粘贴失败:{ex.Message}"); } } private void CopyMenuItemWellDataDlg_Click(object sender, EventArgs e) { if (WellDataGridView.SelectedRows == null || WellDataGridView.SelectedRows.Count == 0) { MessageBox.Show("请先选择数据行"); return; } try { Clipboard.SetDataObject(WellDataGridView.GetClipboardContent()); } catch (Exception ex) { } } public int GetMaxSelectedRowIndex(DataGridView dgv) { // 如果没有选中任何行或单元格 if (dgv.SelectedRows.Count == 0 && dgv.SelectedCells.Count == 0) { return -1; // 返回-1表示未选中 } // 获取选中行和选中单元格中的最大行号 int maxFromRows = dgv.SelectedRows.Count > 0 ? dgv.SelectedRows.Cast().Max(r => r.Index) : -1; int maxFromCells = dgv.SelectedCells.Count > 0 ? dgv.SelectedCells.Cast().Max(c => c.RowIndex) : -1; // 返回两者中的较大值 return Math.Max(maxFromRows, maxFromCells); } private void DelMenuItemWellDataDlg_Click(object sender, EventArgs e) { if (WellDataGridView.SelectedRows == null || WellDataGridView.SelectedRows.Count == 0) { MessageBox.Show("请先选择需要删除的数据行"); } else { List rowsToDelete = new List(); foreach (DataGridViewRow row in WellDataGridView.SelectedRows) { if (row.IsNewRow) continue; DataRowView rowView = (DataRowView)row.DataBoundItem; rowsToDelete.Add(rowView.Row); } foreach (DataRow row in rowsToDelete) { mDatas.Rows.Remove(row); } WellDataGridView.Refresh(); // m_IsModified = true; } } private void ClearMenuItemWellDataDlg_Click(object sender, EventArgs e) { mDatas.Clear(); m_IsModified = true; this.WellDataGridView.Refresh(); } private void WellDataGridView_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { } } private void FrmWellDataEdit_Resize(object sender, EventArgs e) { FrmResize(sender, e); } } }