将excel数据粘贴到空白DataGridView – 索引超出范围的exception
我有一个Excel表格,内容如下:
所以,我想要实现的是从Excel复制并粘贴到一个空白的DataGridView
视图。
这是迄今为止的代码:
private void PasteClipboard(DataGridView myDataGridView) { DataObject o = (DataObject)Clipboard.GetDataObject(); if (o.GetDataPresent(DataFormats.Text)) { string[] pastedRows = Regex.Split(o.GetData(DataFormats.Text).ToString().TrimEnd("\r\n".ToCharArray()), "\r\n"); foreach (string pastedRow in pastedRows) { string[] pastedRowCells = pastedRow.Split(new char[] { '\t' }); using (DataGridViewRow myDataGridViewRow = new DataGridViewRow()) { for (int i = 0; i < pastedRowCells.Length; i++) myDataGridViewRow.Cells[i].Value = pastedRowCells[i]; myDataGridView.Rows.Add(myDataGridViewRow); } } } }
代码运行时,我收到以下错误:
我手边接近这个任务吗?
经过一番挖掘,我发现我必须先添加列,然后添加一个新行,获取新创build行的行索引,然后设置单元格值。
这是更新的代码:
DataObject o = (DataObject)Clipboard.GetDataObject(); if (o.GetDataPresent(DataFormats.Text)) { if (myDataGridView.RowCount > 0) myDataGridView.Rows.Clear(); if (myDataGridView.ColumnCount > 0) myDataGridView.Columns.Clear(); bool columnsAdded = false; string[] pastedRows = Regex.Split(o.GetData(DataFormats.Text).ToString().TrimEnd("\r\n".ToCharArray()), "\r\n"); foreach (string pastedRow in pastedRows) { string[] pastedRowCells = pastedRow.Split(new char[] { '\t' }); if (!columnsAdded) { for (int i = 0; i < pastedRowCells.Length; i++) myDataGridView.Columns.Add("col" + i, pastedRowCells[i]); columnsAdded = true; continue; } myDataGridView.Rows.Add(); int myRowIndex = myDataGridView.Rows.Count - 1; using (DataGridViewRow myDataGridViewRow = myDataGridView.Rows[myRowIndex]) { for (int i = 0; i < pastedRowCells.Length; i++) myDataGridViewRow.Cells[i].Value = pastedRowCells[i]; } } }
}
在这里它正在工作:
乐于接受批评和有用的提示,以改善这一点。 这个代码很慢…
定义你的gridview列,如果没有,你必须先定义列。
private void PasteClipboard(DataGridView myDataGridView) { DataObject o = (DataObject)Clipboard.GetDataObject(); if (o.GetDataPresent(DataFormats.Text)) { string[] pastedRows = Regex.Split(o.GetData(DataFormats.Text).ToString().TrimEnd("\r\n".ToCharArray()), "\r\n"); foreach (string pastedRow in pastedRows) { string[] pastedRowCells = pastedRow.Split(new char[] { '\t' }); using (DataGridViewRow myDataGridViewRow = new DataGridViewRow()) { myDataGridViewRow = (DataGridViewRow) myDataGridView.RowTemplate.Clone(); for (int i = 0; i < pastedRowCells.Length; i++) myDataGridViewRow.Cells[i].Value = pastedRowCells[i]; myDataGridView.Rows.Add(myDataGridViewRow); } } } }
如果没有定义列
private void PasteClipboard(DataGridView myDataGridView) { //Create COlumns in datagridView myDataGridView = new DataGridView(); myDataGridView.Columns.Add("col1", "Col1"); myDataGridView.Columns.Add("col2", "Col2"); myDataGridView.Columns.Add("col3", "Col3"); myDataGridView.Columns.Add("col4", "Col4"); DataObject o = (DataObject)Clipboard.GetDataObject(); if (o.GetDataPresent(DataFormats.Text)) { string[] pastedRows = Regex.Split(o.GetData(DataFormats.Text).ToString().TrimEnd("\r\n".ToCharArray()), "\r\n"); foreach (string pastedRow in pastedRows) { string[] pastedRowCells = pastedRow.Split(new char[] { '\t' }); using (DataGridViewRow myDataGridViewRow = new DataGridViewRow()) { myDataGridViewRow = (DataGridViewRow) myDataGridView.RowTemplate.Clone(); for (int i = 0; i < pastedRowCells.Length; i++) myDataGridViewRow.Cells[i].Value = pastedRowCells[i]; myDataGridView.Rows.Add(myDataGridViewRow); } } } }
完美的代码在这里:(写入button)
DataObject o = (DataObject)Clipboard.GetDataObject(); if (o.GetDataPresent(DataFormats.Text)) { if (myDataGridView.RowCount > 0) myDataGridView.Rows.Clear(); if (myDataGridView.ColumnCount > 0) myDataGridView.Columns.Clear(); bool columnsAdded = false; string[] pastedRows = Regex.Split(o.GetData(DataFormats.Text).ToString().TrimEnd("\r\n".ToCharArray()), "\r\n"); int j=0; foreach (string pastedRow in pastedRows) { string[] pastedRowCells = pastedRow.Split(new char[] { '\t' }); if (!columnsAdded) { for (int i = 0; i < pastedRowCells.Length; i++) myDataGridView.Columns.Add("col" + i, pastedRowCells[i]); columnsAdded = true; continue; } myDataGridView.Rows.Add(); int myRowIndex = myDataGridView.Rows.Count - 1; using (DataGridViewRow myDataGridViewRow = myDataGridView.Rows[j]) { for (int i = 0; i < pastedRowCells.Length; i++) myDataGridViewRow.Cells[i].Value = pastedRowCells[i]; } j++; } }
由Latheesan的代码修改。
一个非常好的解决scheme发布在这里 :
但是,需要更改一行:
if (dgv.Rows.Count < (r + rowsInClipboard.Length)) dgv.Rows.Add(r + rowsInClipboard.Length - dgv.Rows.Count);
需要更改为:
if (dgv.Rows.Count < (r + rowsInClipboard.Length)) dgv.Rows.Add(r + rowsInClipboard.Length+1 - dgv.Rows.Count);
如果这一行没有改变,粘贴的最后一行将不会被传递给SQL。
//列数错误Propered :: //
using System.Linq; DataTable xDataTable = new DataTable(); DataObject XClipboardDat = (DataObject)Clipboard.GetDataObject(); if (XClipboardDat.GetDataPresent(DataFormats.Text)) { string[] XClipboardRows = Regex.Split(XClipboardDat.GetData(DataFormats.Text).ToString(), @"[\r\n]+").Where(y => !string.IsNullOrEmpty(y.ToString())).ToArray(); IEnumerable<string[]> XDatRowCol = XClipboardRows.Select(xRow => Regex.Split(xRow, @"[\t]+").Where(y => !string.IsNullOrEmpty(y.ToString())).ToArray()); int ColNum = XDatRowCol.Select(XDatRow => XDatRow.Length).ToArray().Max<int>(); for (int i = 0; i < ColNum; i++) { xDataTable.Columns.Add(); } foreach(string[] XDatRow in XDatRowCol) { xDataTable.Rows.Add(XDatRow); } dataGridView2.DataSource = xDataTable; }
我知道这是几年后,但我正在寻找这个问题的解决scheme,并发现了BASA的Latheesan代码的修改。 它只是部分工作,所以修改它,我想为未来的浏览器添加此解决scheme:
private void Paste(DataGridView d) { DataObject o = (DataObject)Clipboard.GetDataObject(); if (o.GetDataPresent(DataFormats.StringFormat)) { string[] pastedRows = Regex.Split(o.GetData(DataFormats.StringFormat).ToString().TrimEnd("\r\n".ToCharArray()), "\r"); int j = 0; try { j = d.CurrentRow.Index; } catch { } foreach (string pastedRow in pastedRows) { DataGridViewRow r = new DataGridViewRow(); r.CreateCells(d, pastedRow.Split(new char[] { '\t' })); d.Rows.Insert(j, r); j++; } } }
我刚刚修改了@ Latheesan的代码 ,下面是最短的版本。
DataObject o = (DataObject)Clipboard.GetDataObject(); if (o.GetDataPresent(DataFormats.Text)) { if (myDataGridView.Rows.Count > 0) myDataGridView.Rows.Clear(); if (myDataGridView.Columns.Count > 0) myDataGridView.Columns.Clear(); bool columnsAdded = false; string[] pastedRows = Regex.Split(o.GetData(DataFormats.Text).ToString().TrimEnd("\r\n".ToCharArray()), "\r\n"); foreach (string pastedRow in pastedRows) { string[] pastedRowCells = pastedRow.Split(new char[] { '\t' }); if (!columnsAdded) { for (int i = 0; i < pastedRowCells.Length; i++) myDataGridView.Columns.Add("col" + i, pastedRowCells[i]); columnsAdded = true; continue; } myDataGridView.Rows.Add(pastedRowCells); //***You don't need following lines, use just above line. *** //myDataGridView.Rows.Add(); //int myRowIndex = myDataGridView.Rows.Count - 1; //using (DataGridViewRow myDataGridViewRow = myDataGridView.Rows[myRowIndex]) //{ // for (int i = 0; i < pastedRowCells.Length; i++) // myDataGridViewRow.Cells[i].Value = pastedRowCells[i]; //} } }