T34
1

Все таки подружить кириллицу с буфером обмена

27.11.2011, 19:52. Показов 2814. Ответов 2
Метки нет (Все метки)

Всем привет! Распространенная проблема, но что-то не могу найти решение.

Есть DataGridView в ней данные, 15 рядов, 8 столбцов, плюс заголовки подписанные по русски.

Надо сделать так чтобы эту табличку по ctrl+c засасывало в буфер обмена, а потом вставляло в ворд и эксель. Вставляться должно естественно табличкой. По умолчанию все работает само кроме передачи русских букв, вставляются кракозябры. Менять кодировки не помогает.

Повесили на контрл-с, событие внутри события пытаюсь сам заполнить буфер обмена.

полуработающие варианты такие:

C#
1
2
String HTMStr=DataGrid.GetClipboardContent().GetText(TextDataFormat.Html);
Clipboard.SetText(HTMStr, TextDataFormat.UnicodeText);
Тут все передается, текст русский, в эксель вставляется табличкой, но ворд не видя атрибута ХТМЛ, вставляет это как текст.

Второй вариант использовать Stream поскольку он пихается в буфер и выпихивается без перевода кириллицы в не пойми что.

C#
1
2
3
String HTMStr=DataGrid.GetClipboardContent().GetText(TextDataFormat.Html);
MemoryStream STData = new MemoryStream(Encoding.UTF8.GetBytes(HTMStr));
Clipboard.SetData(DataFormats.Html, STData);
В этом варианте все работает еще лучше, но только до определенного размера, Из таблицы 6 строк передаются нормально, а 15 строк засасываются в буфер обмена, а вставить их нельзя и ворд и эксель повисают. Пробовал менять MemoryStream на FileStream, думал в нем проблема, в файле информация вся правильная. При этом

C#
1
Clipboard.SetData(DataFormats.Html, DataGrid.GetClipboardContent().GetData(DataFormats.Html));
также как и
C#
1
Clipboard.SetDataObject(DataGrid.GetClipboardContent());
все передают без подвисания, но с кривым шрифтом.

Так как же все таки это делать? Как передать таблицу через буфер обмена чтобы по русски и чтобы передалось.

попутно у меня еще есть не понятка с функцией SetData, она по описанию должна добавлять данные в разных форматах, а потом уже из буфера приложения берет то которое может обработать, однако применяя SetData и SetText я смог добиться наличия в буфере данных 2 форматов, но несколько раз применив SetData в буфере остается только 1 последний... что я не так делаю?

Очень нужна помощь, спасибо!
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2011, 19:52
Ответы с готовыми решениями:

Как подружить UploadFile и кириллицу?
Пожалуйста подскажите. Выгружаю на ФТП текстовый файл - содержимое файла русским текстом...

работа с буфером обмена
Как написать процедуру обработки события нажатия кнопки, которая реализует действия: сохранить...

Работа с буфером обмена
Подскажите. Есть ли возможность реализовать следующее: Файлы пдф, тиф, джипе хранятся в базе в...

Работа с буфером обмена
В общем нужна программа, которая по клавише активации(например F10) считывала кол-во символов в...

2
T34
28.11.2011, 12:31 2
Интересные наблюдения Во всем виноват UTF8, если делать все тоже самое но в другие форматы, таблица передается но с кракозябрами. Если передавать в UTF8, то строки оказываются доходят не полностью
1 строка полностью
2 строки полностью
3 строки без 2 псоледних элементов
4 виснут,
5 строк без 6 последних элементов
и так далее, то отрезается элементы то нет, причем они не пропадают, а заменяются на пустые.
И в зависимости от наполнения таблицы в разных строках по разному отрезается. Очевидно проблема в получении наверное попадают какие то неугодные виндоусу или кому то символы UTF8, у кого какие идеи есть?
T34
28.11.2011, 22:39 3
Вообщем ларчик просто открывался. При переводе русского текста в UTF8 его длинна увеличивается в 2 раза, то есть 1 символ меняется на 2. А поля в начале ХТМЛ формата оказалось очень важны, их длину я выставлял, но до перевода в UTF8.

Сейчас перевел строку в UTF8, потом полученный бинарь интерпретировал в дефолтную кодировку, пересчитал длинны сегментов, и все заработало. УРА!

вот такой код правильно пихает русскую таблицу в буфер

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
String HTData=ColibrDataGrid.GetClipboardContent().GetText(TextDataFormat.Html);
int StartLen = HTData.Length;
 
byte[] UTF8Data=Encoding.UTF8.GetBytes(HTData);
HTData = Encoding.Default.GetString(UTF8Data);
 
int LenAdd = HTData.Length - StartLen;
 
String HTMLLenData = HTData.Substring(HTData.IndexOf("EndHTML") + 8, 8);
String FragmentLenData = HTData.Substring(HTData.IndexOf("EndFragment") + 12, 8);
String NewHTMLLenData = (int.Parse(HTMLLenData) + LenAdd).ToString("D8");
String NewFragmentLenData = (int.Parse(FragmentLenData) + LenAdd).ToString("D8");
HTData = HTData.Replace("EndHTML:" + HTMLLenData, "EndHTML:" + NewHTMLLenData);
HTData = HTData.Replace("EndFragment:" + FragmentLenData, "EndFragment:" + NewFragmentLenData);
 
byte[] DataToStream = Encoding.Default.GetBytes(HTData);
MemoryStream DataToClipBoard = new MemoryStream(DataToStream);
Clipboard.SetData(DataFormats.Html, DataToClipBoard);
DataToClipBoard.Dispose();
причем Stream можно и не использовать, можно напрямую

C#
1
Clipboard.SetText(HTData, TextDataFormat.Html);
Вот.
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2011, 22:39

Работа с буфером обмена
Коллеги, как узнать - с какого листа текущей книги взята в буфер обмена некоторая область (и взята...

Работа с буфером обмена
Всем привет .. Помогите пожалуйста ... Работаю на QT под Линукс ... Как мне записать информацию в...

Qt работа с буфером обмена
Доброго времени суток форумчане. Мне необходимо написать скрипт(программу) которая бы позволяла...

Работа с буфером обмена
Нужно чтобы при нажатии на кнопку, переменной присваивалось значение, находящееся в буфере обмена....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.