Почему не работает копирование и вставка, если в выделении datagridview присутствует символ NUL?

Почему любая форма копирования / вставки datagridview не будет работать, если присутствуют символы "NUL" (т.е. код ASCII = 0)? Если в данных присутствуют символы "NUL", datagridview отображает их как пробелы, но не копирует (или, по крайней мере, не вставляет) за пределы их экземпляра. Я не уверен, нашел ли я ошибку или просто не понимаю поведения буфера обмена / копирования / вставки. Как ручное копирование / вставка, так и программные методы дают одинаковые результаты. Если выбрать вручную, будет отображаться выбор нескольких строк, но при вставке одной из них будут вставлены только данные до первого экземпляра символа «NUL». Остальные данные в этой строке и во всех других строках не вставляются.

Кажется, что ни одна из настроек строки / редактирования не имеет значения. Метод генерации данных в ячейках вроде не имеет значения. Я искал в Google и S.O. Ибо ответ безрезультатно. Да, я видел S.O. сообщений Скопируйте строковые данные с символом NULL внутри строки в массив символов и NULL в строке не может скопируйте содержимое после NUL и некоторых похожих сообщений, но ни один из них не отвечает на вопрос - они только предоставляют обходные пути, включающие замену символов NUL. Я надеюсь понять «почему», а также найти способ скопировать / вставить, включая символы NUL.

Я создал чисто тестовый сценарий. Прошу прощения, если я добавил слишком много. Я не совсем уверен, что требуется / уместно, поэтому я слишком сильно ошибся.

using System;
using System.Data;
using System.Windows.Forms;

namespace GQ
{
    public partial class frmTestOfDataGrid : Form
    {
        public frmTestOfDataGrid()
        {
            InitializeComponent();
        }

        private void buttonRunTest_Click(object sender, EventArgs e)
        { 
            BindingSource myBindingSource = new BindingSource();
            myBindingSource.DataSource = CreateTestDataTable();
            dataGridView1.DataSource = myBindingSource;
            dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
        }
        private DataTable CreateTestDataTable()
        {
            char Nul = (char)0;
            string myTestString1 = "The Nul characters are between these >" + Nul + Nul + "< and you can't copy anything after them.";
            string myTestString2 = "Second line of test data will not end up being copied to clipboard if above Nul characters are included in selection.";
            DataTable tbl = new DataTable();
            tbl.Columns.Add("RowIndex", typeof(Int32));
            tbl.Columns.Add("RowValue", typeof(String));
            DataRow dr1 = tbl.NewRow();
            dr1[0] = 0;
            dr1[1] = myTestString1;
            tbl.Rows.Add(dr1);
            DataRow dr2 = tbl.NewRow();
            dr2[0] = 1Y;
            dr2[1] = myTestString2;
            tbl.Rows.Add(dr2);
            return tbl;
        }

        private void buttonCopyToClipboard_Click(object sender, EventArgs e)
        {
            if (this.dataGridView1
                .GetCellCount(DataGridViewElementStates.Selected) > 0)
            {
                Clipboard.SetDataObject(this.dataGridView1.GetClipboardContent());
            }
        }
    }
}
namespace GQ
{
    partial class frmTestOfDataGrid
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.dataGridView1 = new System.Windows.Forms.DataGridView();
            this.buttonRunTest = new System.Windows.Forms.Button();
            this.buttonCopyToClipboard = new System.Windows.Forms.Button();
            ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
            this.SuspendLayout();
            // 
            // dataGridView1
            // 
            this.dataGridView1.AllowUserToAddRows = false;
            this.dataGridView1.AllowUserToDeleteRows = false;
            this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
            this.dataGridView1.Location = new System.Drawing.Point(10, 43);
            this.dataGridView1.Name = "dataGridView1";
            this.dataGridView1.ReadOnly = true;
            this.dataGridView1.Size = new System.Drawing.Size(963, 313);
            this.dataGridView1.TabIndex = 0;
            // 
            // buttonRunTest
            // 
            this.buttonRunTest.Location = new System.Drawing.Point(753, 371);
            this.buttonRunTest.Name = "buttonRunTest";
            this.buttonRunTest.Size = new System.Drawing.Size(146, 27);
            this.buttonRunTest.TabIndex = 1;
            this.buttonRunTest.Text = "Run Test";
            this.buttonRunTest.UseVisualStyleBackColor = true;
            this.buttonRunTest.Click += new System.EventHandler(this.buttonRunTest_Click);
            // 
            // buttonCopyToClipboard
            // 
            this.buttonCopyToClipboard.Location = new System.Drawing.Point(753, 403);
            this.buttonCopyToClipboard.Name = "buttonCopyToClipboard";
            this.buttonCopyToClipboard.Size = new System.Drawing.Size(146, 27);
            this.buttonCopyToClipboard.TabIndex = 2;
            this.buttonCopyToClipboard.Text = "Then Copy To Clipboard";
            this.buttonCopyToClipboard.UseVisualStyleBackColor = true;
            this.buttonCopyToClipboard.Click += new System.EventHandler(this.buttonCopyToClipboard_Click);
            // 
            // frmTestOfDataGrid
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(976, 442);
            this.Controls.Add(this.buttonCopyToClipboard);
            this.Controls.Add(this.buttonRunTest);
            this.Controls.Add(this.dataGridView1);
            this.Name = "frmTestOfDataGrid";
            this.Text = "frmTestOfDataGrid";
            ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
            this.ResumeLayout(false);
        }

        #endregion

        private System.Windows.Forms.DataGridView dataGridView1;
        private System.Windows.Forms.Button buttonRunTest;
        private System.Windows.Forms.Button buttonCopyToClipboard;
    }
}

person AndrewBanjo1968    schedule 02.11.2017    source источник


Ответы (1)


(char) 0 или '\ 0' - это в основном конец строки. Вот почему копия не берет то, что есть потом.

Я поставил новую строку в годовом предложении, в нем показаны два символа  введите описание изображения здесь

введите описание изображения здесь

А из сетки еще можно копировать / вставлять.

введите описание изображения здесь

Необычно использовать ('\ 0'), мне любопытно узнать, в чем причина его использования?

Вы можете увидеть обсуждение на Почему нам нужно добавлять '\ 0' (ноль) в конец символьного массива в C?

person Daniel B    schedule 03.11.2017
comment
Я / мы его туда не кладем. Иногда в файлах заказчиков попадают странные символы. \ 0, \ r, \ n, слово NULL прописано ... все присутствует в данных. Фу. Но в некоторых случаях нам нужно сохранить именно то, что входит. Что касается того, почему эти конкретные символы присутствуют в некоторых полях в данных о клиентах - понятия не имею. - person AndrewBanjo1968; 03.11.2017
comment
Я понимаю . Я предполагаю, что они объединяют несколько полей, в которых некоторые из них иногда нулевые. В этом случае вы можете заменить их на string.empty - person Daniel B; 03.11.2017