Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
T34

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

27.11.2011, 19:52. Показов 4462. Ответов 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 последний... что я не так делаю?

Очень нужна помощь, спасибо!
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.11.2011, 19:52
Ответы с готовыми решениями:

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

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

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

2
T34
28.11.2011, 12:31
Интересные наблюдения Во всем виноват UTF8, если делать все тоже самое но в другие форматы, таблица передается но с кракозябрами. Если передавать в UTF8, то строки оказываются доходят не полностью
1 строка полностью
2 строки полностью
3 строки без 2 псоледних элементов
4 виснут,
5 строк без 6 последних элементов
и так далее, то отрезается элементы то нет, причем они не пропадают, а заменяются на пустые.
И в зависимости от наполнения таблицы в разных строках по разному отрезается. Очевидно проблема в получении наверное попадают какие то неугодные виндоусу или кому то символы UTF8, у кого какие идеи есть?
T34
28.11.2011, 22:39
Вообщем ларчик просто открывался. При переводе русского текста в 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);
Вот.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.11.2011, 22:39
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru