Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > HtmlElement, webBrowser


Автор: Cobalt 16.8.2010, 22:49
Цитата(diadiavova @  16.8.2010,  20:17 Найти цитируемый пост)

Цитата(Cobalt @  16.8.2010,  20:15 Найти цитируемый пост)
с# 2005 express не поддерживает linq что ли ?

 smile 
Или поставь более позднюю версию или по старинке - циклами. 
Код

List<HtmlElement> elements = new List<HtmlElement>();
foreach(HtmlElement el in webbrowser1.Document.GetElementsByTagName("td"))
{
    if(el.GetAttribute("class") == "tab_head")
    {
        elements.Add(el);
    }
}

В коллекцию elements добавляются все ячейки с заданным классом.

Или можно попробовать подключить библиотеку System.Core и импортировать пространство System.Linq, только синтаксис будет другим
Код

IEnumerable<HtmlElement> = Enumerable.Where(webbrowser1.Document.GetElementsByTagName("td"),
                                                 delegate (HtmlElement x) {return x.GetAttribute("class") == "tab_head";});

Но это уже совсем другая песня. smile


хе хе, снес 2005 экспресс, поставил 2008 экспресс, таже фигня  smile  опять сносить и искать полную версию не хотца
то ли лыжи не едут, то ли...
решил по старинке, не пашет, я и так и эдак, не пашет, дело видать в том что он class не опознает, что возмутительно smile  
а по ширине например работает  smile 

if (el.GetAttribute("width") == "133")

дело наверное в этом 
Атрибутом элемента HTML является любая допустимая пара "имя-значение" для этого элемента. Класс HtmlElement предоставляет доступ только к атрибутам, общим для всех элементов, но не к тем, которые применяются только к определенным типам элементов. Например, атрибут SRC является предопределенным для тега IMG, но не для тега DIV.

наверное будут у меня еще вопросы  smile 

Автор: diadiavova 16.8.2010, 23:13
Цитата(Cobalt @  16.8.2010,  23:49 Найти цитируемый пост)
, поставил 2008 экспресс, таже фигня    опять сносить и искать полную версию не хотца

Дело не в версии(с ней порядок), а в целевом фреймворке проекта, должен быть 3.5.
Цитата(Cobalt @  16.8.2010,  23:49 Найти цитируемый пост)
дело видать в том что он class не опознает, что возмутительно

Точно, совсем забыл. smile 
Вместо 
Код

el.GetAttribute("class")

сделай так
Код

el.DomElement.GetType().GetProperty("className").GetValue(el.DomElement, null)


Автор: Cobalt 17.8.2010, 00:02
Цитата(diadiavova @  16.8.2010,  23:13 Найти цитируемый пост)
Дело не в версии(с ней порядок), а в целевом фреймворке проекта, должен быть 3.5.

ха, точно, я взял тот проект, студия его переконвертила, не знал про это, вроде стоит 3,5, но не хочет линк понимать, ну да фиг с ним 


 
Код

        el.DomElement.GetType().GetProperty("className").GetValue(el, null)



это выше моего понимания  smile , мож я неправильно использую, поэтому и ругается 
В экземпляре объекта не задана ссылка на объект.

попробую использовать свойство строк Contains, или че нить типа того ) 

Автор: diadiavova 17.8.2010, 00:05
Цитата(Cobalt @  17.8.2010,  01:02 Найти цитируемый пост)
это выше моего понимания   , мож я неправильно использую, поэтому и ругается 

там поначалу была ошибка, но я ее исправил, а у тебя старая версия кода.

Добавлено через 2 минуты и 50 секунд
Вообще, для работы с DOM лучше подключить библиотеку mshtml  и работать с ней, тогда будет доступ ко всем возможностям.

Автор: diadiavova 17.8.2010, 00:40
Короче, пример состряпал. Здесь я выбираю дивы, у которых class="odd" и вывожу их содержимое в окно сообщений. 

Автор: Cobalt 17.8.2010, 17:46
diadiavova,  не хочу надоедать  smile  но таже самая ошибка в примере
В экземпляре объекта не задана ссылка на объект.
если у Вас все ок значит чето у меня не того  smile  
буду думать ) 
спасибо за потраченное на меня время =)

Автор: diadiavova 17.8.2010, 19:37
Цитата(Cobalt @  17.8.2010,  18:46 Найти цитируемый пост)
но таже самая ошибка в примере

В том примере, который я выложил? smile 

Автор: Cobalt 17.8.2010, 19:45
Цитата(diadiavova @  17.8.2010,  19:37 Найти цитируемый пост)
В том примере, который я выложил?  

аха, он на работе не пахал у меня, т.е. запускался а мессандж бокса нет
дома прикрутил кнопку, и там уже ошибка  smile 

я короче подумал и сделал по простому, 

 
Код

foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("td"))
          {

              if (el.OuterHtml.Contains("class=tab_head") == true)
              {
                  try
                  {
                       elements.Add(el);
                    
                  }
                  catch { };

              }

           }
          elements.RemoveAt(0); //первый элемент приходится удалять так как он содержит все остальные


решение локально, ну да фиг с ним  smile 

я пока прогу буду писать уже и работа кончится  smile 

Автор: diadiavova 17.8.2010, 21:00
Цитата(Cobalt @  17.8.2010,  20:45 Найти цитируемый пост)
аха, он на работе не пахал у меня, т.е. запускался а мессандж бокса нет
дома прикрутил кнопку, и там уже ошибка

Ну не знаю, я только что скачал, запустил и все работает. По-моему такого просто не бывает smile 
Тут может спасти только отладка, надо смотреть, какой именно объект не создается. Но это надо делать тебе, поскольку у меня все работает.

Автор: Cobalt 17.8.2010, 21:18
Цитата(diadiavova @  17.8.2010,  21:00 Найти цитируемый пост)
Ну не знаю, я только что скачал, запустил и все работает. По-моему такого просто не бывает 

аха smile  мистика какая то, скачал щаз по новой, запустил, так же как и на работе приложение запускается, страничка грузится, и все 

Автор: diadiavova 17.8.2010, 21:28
Я малость переделал, теперь сообщение выскакивает по нажатию кнопки. Попробуй запустить. Если опять не пойдет - поставь точку останова на мессэджбоксе и посмотри какого именно объекта не существует. 

Автор: Cobalt 18.8.2010, 20:50
вообщем лана, подобрался я к основной сути проблемы, полученные данные надо записать  в html шаблон в нужные места, вот скажем имею я путь к шаблону.
далее создать надо наверное браузер и загрузить туда файл.
а дальше ....
есть в шаблоне такая таблица 

Код

 <table border= "0" CELLSPACING="1" CELLPADDING="0" WIDTH="700" bordercolorlight="#008080">
          <tr BGCOLOR="#DCE4E7">
            <td CLASS="headparam" width="215" height="32">
              
                Параметры
            </td>
            <td CLASS="headparam" width="474" height="32">&nbsp;</td>
              
          </tr>
          <tr BGCOLOR="#F0F4F5">
            <td CLASS="param" style="text-align: left">&nbsp;</td>
            <td CLASS="param" width="474" height="25">&nbsp;</td>
          </tr>
          </table>



есть значит List<HtmlElement> elements1, List<HtmlElement> elements2
скажем в первом содержится инфа для 1 столбца, во втором для второго для выше приведенной таблицы

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


Автор: Cobalt 18.8.2010, 21:20
как с помощью OuterHtml задать код элементу? че то  не пойму  smile 

Автор: Cobalt 20.8.2010, 21:16
блин, запарился уже , не работает код и все

 HtmlElement td = webBrowser1.Document.CreateElement("TD");
            //  string rr = "<td CLASS=\"param\" style=\"text-align: left\">&nbsp;</td>";
            td.SetAttribute("CLASS", "param");
            td.Style = "text-align:left";
            td.InnerText = "ВАСЯЯЯ!!!!!!!";
            webBrowser1.Document.Body.AppendChild(td);
            
           
            webBrowser1.Document.Title = "ffdf";
            webBrowser1.Document.Write(webBrowser1.DocumentText);

            webBrowser1.Refresh();
            if (webBrowser1.Document != null)
            {


                richTextBox1.AppendText(webBrowser1.DocumentText);


            }

 smile 
           

Автор: diadiavova 21.8.2010, 08:10
Cobalt, с атрибутом class нужно работать через свойство className элемента.

Автор: Cobalt 23.8.2010, 08:49
Цитата(diadiavova @  21.8.2010,  08:10 Найти цитируемый пост)
Cobalt, с атрибутом class нужно работать через свойство className элемента.

ну тег то он создает, и нужные параметры прописывает
но тут
webBrowser1.Document.Body.AppendChild(td)
ничего не происходит, хоть убейся
и тут тоже
webBrowser1.Document.Title = "ffdf";
 я вывожу потом в текст бокс весь текст, но там все также как и было

Автор: diadiavova 23.8.2010, 09:11
Ну вообще-то TD - это ячейка таблицы и добавлять ее можно только в строку таблицы, а не в тело документа.

Автор: Cobalt 23.8.2010, 18:05
Цитата(diadiavova @  23.8.2010,  09:11 Найти цитируемый пост)
Ну вообще-то TD - это ячейка таблицы и добавлять ее можно только в строку таблицы, а не в тело документа.

переделал, td добавляется в tr, tr в table, table в body, нифига


Цитата(Cobalt @  23.8.2010,  08:49 Найти цитируемый пост)
webBrowser1.Document.Title = "ffdf";

тож не пашет %)
хотя ясно написано, получает или задает заголовок 
 smile 

Автор: Cobalt 23.8.2010, 18:46
местами разобрался

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)