Pasting excel data into a blank DataGridView - Index out of range exception

前端 未结 8 1452
不思量自难忘°
不思量自难忘° 2020-12-30 07:20

I have an excel sheet with the following:

\"enter

So, what I am trying to achi

相关标签:
8条回答
  • 2020-12-30 07:53

    Perfect Code here: (write in 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++;
        }
    }
    

    Modified from Latheesan's code.

    0 讨论(0)
  • 2020-12-30 07:59

    //Column Count Bug 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;
     }
    
    0 讨论(0)
  • 2020-12-30 08:01

    A really nice solution was posted here:

    But, one line needs to be changed:

     if (dgv.Rows.Count < (r + rowsInClipboard.Length))
                dgv.Rows.Add(r + rowsInClipboard.Length - dgv.Rows.Count);
    

    needs to be changed to:

     if (dgv.Rows.Count < (r + rowsInClipboard.Length))
                dgv.Rows.Add(r + rowsInClipboard.Length+1 - dgv.Rows.Count);
    

    If this line isn't changes, the last row pasted will not be passed to SQL.

    0 讨论(0)
  • 2020-12-30 08:01

    I've just modified @Latheesan's code as below which is the shortest version.

    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];
            //}
        }
    }
    
    0 讨论(0)
  • 2020-12-30 08:03

    I know it's some years later, but I was looking for a solution for this problem and found BASA's modification of Latheesan's code. It only worked partially, so modifying it, I would like to add this solution for future browsers:

    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++;
                }
            }
        }
    
    0 讨论(0)
  • 2020-12-30 08:05

    After some digging around, I found that I have to add columns first, then add a new row, get the row index of the newly created row, and then set the cell values.

    Here's the updated code:

    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];
            }
        }
    }
    

    }

    And here it is working:

    enter image description here

    Happy to accept criticisms and useful tips on improving this. This code is quite slow...

    0 讨论(0)
提交回复
热议问题