C# Взять и вернуть в таблицу с блокировкой

Регистрация
23.03.2015
Сообщения
1 169
Благодарностей
691
Баллы
113
Всем доброго времени суток.
Как провернуть подобное со списком я знаю, но как сделать с таблицей?

Опишу задачу подробно:
В таблице условные 10 строк и 4 столбца. Нужно взять первую строку, разложить её по переменным(4 столбца=4 переменные) и вернуть строку в конец.
Всё это сделать с блокировкой таблицы, чтобы оно могло работать в много потоке
Кто-нибудь может подсказать? А лучше поделиться готовым сниппетом)
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 777
Благодарностей
2 436
Баллы
113
Пример взятия строки и добавление в конец таблички:
IZennoTable  tb = project.Tables["tb"]; // Должна быть табличка с именем tb в шаблоне

tb.AddRow(new[]{"1","2","3","4"}); // Добавили демо данные
tb.AddRow(new[]{"10","20","30","40"}); // Добавили демо данные

// Переменные для результата
string a = string.Empty;
string b = string.Empty;
string c = string.Empty;
string d = string.Empty;

List<string[]> listData = new List<string[]>(); // Результат - мы же не знаем есть ли в строке 4 ячейки (вдруг будет меньше)

lock(SyncObjects.TableSyncer) { // Блокируем для многопотока
  
    if(tb.RowCount > 0) { // Если табличка содержит строчки
        List<string[]> list = new List<string[]>(); // Временный список
        for(int i =0;i<tb.RowCount; i++) list.Add(tb.GetRow(i).ToArray()); // Считываем во временный список
      
        if(list.Count > 0) { // Если что-то было считано с таблички
            tb.Clear(); // Очистим табличку
            string[] temp_data = list[0].ToArray(); // Получаем первую строчку
            listData.Add(temp_data); // Сохраняем результат во временный список
            list.RemoveAt(0); // Удаляем первую строчку
            list.Add(temp_data); // Добавляем строчку в конец
            for(int i=0; i<list.Count; i++) tb.AddRow(list[i]); // Возвращаем данные в табличку
        }
    } 
    else {
        project.SendInfoToLog("В табличке нет данных - разблокировать",true);
    }
  
      
} // Разблокировали табличку

// Дальше что-то делаем с полученными данными
if(listData.Count > 0) { // Что-то нашли
    if(listData[0].Length >= 4) {
        a = listData[0][0];
        b = listData[0][1];
        c = listData[0][2];
        d = listData[0][3];
        listData.Clear();
    }
    else {
        throw new Exception("Строка таблички имеет меньше 4 ячеек");
    }
}
else { // Ничего не нашли
    throw new Exception("В табличке нет данных");
}

project.SendInfoToLog(string.Format(@"{0} {1} {2} {3}",a,b,c,d));
// Дальше уже сохраняем себе куда-то a-b-c-d, например во внутренние переменные
Собственно можно конечно без временных списков, переписывания таблицы и дополнительных проверок, примерно так:
Пример взятия без временных списков:
IZennoTable tb = project.Tables["tb"]; // Здесь будет ошибка если нет таблицы с именем tb
string a = "";
string b = "";
string c = "";
string d = "";
lock (SyncObjects.TableSyncer) {
    string[] cells = tb.GetRow(0).ToArray(); // Здесь будет ошибка, если нет строк в таблице
    a = cells[0];
    b = cells[1]; // Здесь будет ошибка, если в столбце недостаточно ячеек
    c = cells[2];
    d = cells[3];
    tb.DeleteRow(0);
    tb.AddRow(cells);
}
 
Последнее редактирование:
  • Спасибо
Реакции: Dimon174 и KolkaPetkinSyn

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