【问题标题】:Pasting excel data into a blank DataGridView - UTF8将 excel 数据粘贴到空白 DataGridView - UTF8
【发布时间】:2016-02-02 20:57:41
【问题描述】:

所以,我想要实现的是从 Excel 中复制它并将其粘贴到非空白 DataGridView 视图中。我也想对不同的字符可读。我试图在粘贴后不要松开该行(第一张图片)。提前谢谢你。

First Image: http://postimg.org/image/u656ou22v/

错误图片:http://postimg.org/image/63o1evn77/

这是我在添加按钮中的代码:

DataObject o = (DataObject)Clipboard.GetDataObject();
        if (o.GetDataPresent(DataFormats.Text))
        {
            if (dataGridView1.RowCount > 0)
                dataGridView1.Rows.Clear();

            if (dataGridView1.ColumnCount > 0)
                dataGridView1.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++)
                        dataGridView1.Columns.Add("col" + i, pastedRowCells[i]);

                    columnsAdded = true;
                    continue;
                }

                dataGridView1.Rows.Add();
                int myRowIndex = dataGridView1.Rows.Count - 1;

                using (DataGridViewRow myDataGridViewRow = dataGridView1.Rows[j])
                {
                    for (int i = 0; i < pastedRowCells.Length; i++)
                        myDataGridViewRow.Cells[i].Value = pastedRowCells[i];
                }
                j++;
            }
        }

【问题讨论】:

    标签: c# datagridview


    【解决方案1】:

    如果要保留标题,则不必删除 DataGridView 的列。

    这样可以简化您的代码:

    DataObject o = (DataObject)Clipboard.GetDataObject();
    if (o.GetDataPresent(DataFormats.Text))
    {
        if (dataGridView1.RowCount > 0)
            dataGridView1.Rows.Clear();
    
        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' });
    
            dataGridView1.Rows.Add();
            int myRowIndex = dataGridView1.Rows.Count - 1;
    
            using (DataGridViewRow myDataGridViewRow = dataGridView1.Rows[j])
            {
                for (int i = 0; i < pastedRowCells.Length; i++)
                    myDataGridViewRow.Cells[i].Value = pastedRowCells[i];
            }
            j++;
        }
    }
    

    我什至建议您不要删除行,因为您的按钮称为“添加”而不是“替换”:

    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");
        int j = 0;
        foreach (string pastedRow in pastedRows)
        {
            string[] pastedRowCells = pastedRow.Split(new char[] { '\t' });
    
            dataGridView1.Rows.Add();
            int myRowIndex = dataGridView1.Rows.Count - 1;
    
            using (DataGridViewRow myDataGridViewRow = dataGridView1.Rows[j])
            {
                for (int i = 0; i < pastedRowCells.Length; i++)
                    myDataGridViewRow.Cells[i].Value = pastedRowCells[i];
            }
            j++;
        }
    }
    

    我的最后一个建议是您可以添加一些粘贴的数据检查,例如if (pastedRows.length == dataGridView1.RowCount)

    【讨论】:

    • 谢谢它的效果很好,但是字符呢?
    • 我没有足够的信息。也许字体不支持这些字符。请参阅此one。并在从剪贴板获取字符时尝试调试以查看字符是否正确。