да, собственно файл этот для чего нужен?Здравствуйте. Встала такая задача: необходимо создавать таблицу, с заголовками столбцов и строк. Количество строк и столбцов варьируется, так же как и размер заголовка. После того, как получена таблица, её необходимо сохранять в файл.
Таблица нужна в нормальном виде и должна быть возможность получать из него изображение.. Если пробовать рисовать таблицу руками, то это будет кошмар.погодь, в каком виде тебе нужна таблица? в виде изображения?
почему бы не строить(рисовать) сразу в System.Drawing.Bitmap?
Сохранение таблицы в файл необходимо для того, чтобы хранить результаты и при необходимости эту таблицу засунуть в документ и отправить на печать...да, собственно файл этот для чего нужен?
позырить ради или надо потом загружать из него данные?
или ваще нужен экспорт в картинке?
+1 за экспорт в HTML.тогда не заморачивайся с изображениями, а сделай следующее:
1. отображай таблицу во что тебе удобно (DataGrid, ListView, ...)
2. когда встанет вопрос об отправке на печать, сгенерь какой-нибудь промежуточный HTML (с TABLE'ами, TR'ами, TD'шками и пр.) и отправь на печать его.
и проще и дешевле
нужно написать свой алгоритм, в котором и описать процесс выборки каких строк и столбцов тебе нужно, а не всё подряд3. Построение таблицы с помощью DataGridView. Тут тоже в принципе можно построить таблицу и все размеры можно автоматически подогнать. Сохраняется в изображение тоже нормально, но вот только не понятно, как сделать, чтобы сохранялась только таблица, а не вся область DataGridView.
HTML это, конечно, интересно, но изображение предпочтительнее
[Guid("3050f669-98b5-11cf-bb82-00aa00bdce0b"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
ComVisible(true),
ComImport]
interface IHTMLElementRender
{
void DrawToDC([In] IntPtr hDC);
void SetDocumentPrinter([In, MarshalAs(UnmanagedType.BStr)] string bstrPrinterName, [In] IntPtr hDC);
};
private void OnDocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
{
IHTMLDocument2 document = (IHTMLDocument2) this.axWebBrowser1.Document;
if (document != null)
{
IHTMLElement element = (IHTMLElement) document.body;
if (element != null)
{
IHTMLElementRender render = (IHTMLElementRender) element;
if (render != null)
{
using(Bitmap bmp = new Bitmap(1024,768))
using (Graphics g = Graphics.FromImage(bmp))
{
render.DrawToDC(g.GetHdc());
bmp.Save("MyTableImage.bmp");
}
}
}
}
}
Я уже реализовал построение и сохранение таблиц через объект TableLayoutPanelнужно написать свой алгоритм, в котором и описать процесс выборки каких строк и столбцов тебе нужно, а не всё подряд
Опять таки, через TableLayoutPanel.DrawToBitmap() рендерит таблицу нормально и вызовом одной функцииа HTML на битмапку отрендерить и сохранить ее в нужном формате (jpg/gif/bmp/png и т.д.) религия не позволяет?
Опять таки, через TableLayoutPanel.DrawToBitmap() рендерит таблицу нормально и вызовом одной функции
Не понял, что поменять, например? Таблица просто выводит набор полей из базы данных плюс при необходимости она сортируется и выводится процентные соотношения..да нахрен тебе та таблица сдалась? Тебе чтото в ней поменять надо будет и опять голову ломать будешь, вместо того чтобы в html пару тегов добавить
Не понял, что поменять, например? Таблица просто выводит набор полей из базы данных плюс при необходимости она сортируется и выводится процентные соотношения..
Чтобы изменить количество строк или столбцов достаточно изменить их число в соответствующем свойстве объекта.
Конечно, объект.вот и подумай что будет проще поменять - таблицу в html'е или какойто уродливый объект
tableLayoutPanel1.ColumnCount = NewColumnCount;
tableLayoutPanel1.RowCount = NewRowCount;
Ну и где тут грабли? Или тут скорее "граблей бояться - в сарай не ходить"? Не вижу проблемы - уже почти как неделю всё сделано и работает и никаких проблем..Впрочем делай как знаешь, пока человек на грабли не наступит так и не научится ничему
Конечно, объект.
В объекте:
В html же это выглядит как добавление массы тэгов.Код:tableLayoutPanel1.ColumnCount = NewColumnCount; tableLayoutPanel1.RowCount = NewRowCount;
P.S. И, наконец, у меня есть таблица, которая строится прямо на форме. ...
html будет выглядеть по-другому.
Ну и где тут грабли? Или тут скорее "граблей бояться - в сарай не ходить"?
кстати, рендер в битмап тут лишнее. не городите огород.
Нет, я не спорю, может так и правильнее.. Но в первую очередь меня интересует вопрос: почему? Просто объясни. Конечно, можно переделать то, что уже работает, но чтобы начинать работать в этом направлении, необходима какая-то веская причина. Вот чем не устроили свойства и чем кривы эти объекты?html генерить нужно не тупым плюсованием тегов, а с умом - из DataSet'а. Например, я бы сделал так - кидаешь данные в DataSet, сохраняешь в XML, трансформируешь с помощью XSL в HTML. Грузишь в WebBrowser, из обработчика OnDocumentComplete рендеришь содержимое в битмапку и сохраняешь битмапку как bmp или jpeg на диск
Пользователю показывать можешь тот-же WebBrowser загрузив в него сгенеренный HTML. Все будет выглядеть один в один, т.к. будет использован один и тот-же рендерер...
Если надо подправить внешний вид - достаточно XSLT файло с шаблоном поправить. Никаких свойств и кривых объектов юзать не надо. Все автоматом рендерится, таблицы авторесайзятся как душе угодно и т.п. Оформление на любой вкус - все возможности HTML/CSS к вашим услугам
Если в дальнейшем появится необходимость сохранять например в PDF, добавляешь еще один XSL скрипт для трансформации в FO и цепляешь nFOP, которым процессишь FO в PDF
и это все - десять-двадцать строк на C#, все остальное - оформление рюшечек на HTML/CSS
Нет, я не спорю, может так и правильнее.. Но в первую очередь меня интересует вопрос: почему?