Формирование тела письма из данных определенной строки таблицы С#

idleSSS

Новичок
Регистрация
12.02.2019
Сообщения
28
Благодарностей
3
Баллы
3
Делаю парсер с последующей отправкой полученных данных по e-mail.
Весь смысл в том, чтобы сравнить данные в списке (новые данные), с данными в таблице. Если данные списка присутствуют в таблице, то берем все ячейки каждой строки и записываем их в столбик, чтобы тело письма выглядело так:
Из первой строки:
Значение 1 - значение из первой ячейки
Значение 2 - значение из второй ячейки
Значение 3 - значение из третьей ячейки и т.д.
----------------------------------------------- (разделитель)
Из второй строки:
Значение 1 - значение из первой ячейки
Значение 2 - значение из второй ячейки
Значение 3 - значение из третьей ячейки и т.д.
-------------------------------------------------------- и т.д.
КОД ПАРСЕРА
Код:
lock(SyncObjects.TableSyncer) {
Tab Tab1 = instance.ActiveTab;  // переменная активной вкладки браузера
var ids_parsedList    = project.Lists["ids_parsed"]; //переменная спаршенных ссылок
IZennoTable tblMyData = project.Tables["MyData"]; // переменная таблицы проекта
//Объявляем коллекцию элементов и находим все нужные строки
HtmlElementCollection colRows = Tab1.FindElementsByXPath("//table[@class='es-reestr-tbl its']");
//перебираем каждую строку
foreach(HtmlElement elRow in colRows){
    //получаем данные нужного элемента конкретной строки
    string strCellOne = elRow.FindChildByXPath(".//span[@class='es-el-name']", 0).GetAttribute("innerHtml");
// ищем определенные слова в атрибуте нужного элемента
    if ((strCellOne.Contains("СЛОВО 1") || strCellOne.Contains("СЛОВО 2")) && (strCellOne.Contains("СЛОВО 3") || strCellOne.Contains("СЛОВО 4") || strCellOne.Contains("СЛОВО 5") || strCellOne.Contains("СЛОВО 6") || strCellOne.Contains("СЛОВО 7") || strCellOne.Contains("СЛОВО 8") || strCellOne.Contains("СЛОВО 9")))
{
        //Если нужные слова присутствуют в элементе строки, забираем данные из второй ячейки и по аналогии из остальных ячеек этой строки
        string strCellTwo = elRow.FindChildByXPath(".//input[@content='leaf:objectHrefTerm']", 0).GetAttribute("value");
        string strCellThree = elRow.FindChildByXPath(".//input[@content='leaf:objectHrefTerm']", 0).GetAttribute("value");
        string strCellFour = elRow.FindChildByXPath(".//span[@format='money']", 0).GetAttribute("innerHtml");
    // Записываем данные в таблицу
        tblMyData.AddRow(new String[]{strCellTwo, strCellOne, strCellFour});
        //записываем данные в список
        ids_parsedList.Add(strCellTwo);
ДАЛЕЕ ИДЕТ КОД ПОИСКА СТРОК, КОТОРЫЕ НЕБЫЛИ РАНЕЕ НАЙДЕНЫ И ОТПРАВЛЕНЫ ПО ПОЧТЕ

Код:
var ids_oldList        = project.Lists["ids_old"]; // переменная списка со старыми ссылками
var ids_parsedList    = project.Lists["ids_parsed"]; // переменная со спаршенными ссылками
var ids_new            = project.Lists["ids_new"]; // переменная
var tblMyData = project.Tables["MyData"];
var mailBody = "";
var sendMail = false;
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < ids_parsedList.Count; i++)
    {
        var newID = ids_parsedList[i]; // переменная в которую записываются все спарсенные ссылки
        var isIdNew = true;
        for(int j=0; j < ids_oldList.Count; j++)
        {
            var oldID = ids_oldList[j]; // переменная в которую записываются все старые ссылки
            if (oldID == newID){   // сравнение ссылок в переменных
                isIdNew = false;
                break;
            }
        }
    
        if(isIdNew){
            ids_new.Add(newID); // если есть новые ссылки то добавляем их в список ids_new
for(int k=0; k < tblMyData.RowCount; k++)
    {
        // читаем строку из таблицы (это будет массив ячеек)
        var cells = tblMyData.GetRow(k).ToArray();
        // пройдем в цикле по всем ячейкам
        for (int m=0; m < cells.Length; m++)
        {
            // проверяем содержание текста переменной newID в ячейке, если есть совпадения формируем тело письма
// ВОТ ТУТ У МЕНЯ ПРОБЛЕМА!! Я НЕ МОГУ ПОНЯТЬ КАК СФОРМИРОВАТЬ ТЕЛО ПИСЬМА, ЧТОБЫ БРАЛАСЬ КАЖДАЯ ЯЧЕЙКА И
// ЗАПИСЫВАЛАСЬ В ОТДЕЛЬНУЮ СТРОКУ, КАК Я НАПИСАЛ ВЫШЕ.

            if (cells[m].Contains(newID)) mailBody = mailBody + cells + Environment.NewLine;
                sendMail = true;
        }
            if(sendMail) project.Variables["mailBody"].Value = mailBody;
    }
}
    }
}
СЕЙЧАС МНЕ ПРИХОДИТ ТАКОЕ ПИСЬМО
// System.String[]
//System.String[]
//System.String[]
//System.String[]
//System.String[]
//System.String[]
//System.String[]
//System.String[]

PS: Если работать через список и брать одно значение то все получается идеально, но мне нужно несколько значений.

И еще- не знаю как правильно добавить lock(SyncObjects.TableSyncer), чтобы все работало корректно.
 

idleSSS

Новичок
Регистрация
12.02.2019
Сообщения
28
Благодарностей
3
Баллы
3
Подсказали на другом форуме.
Что можно использовать код
Код:
struct Values
{
    public string Value1;
    public string Value2;
    public string Value3;
    .....
    public string ValueN;
}
.....
List<Values> ValuesList = new List<Values>;
.....
Values valuesname;
valuesname.Value1 = somevalue;
.....
ValuesList.Add(valuesname);
Но куда его прикрутить и как??
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)