Как считать таблицу атрибутов в массив

0 голосов
спросил 15 Июль, 10 от Ilya_Zaycev (380 баллов) в категории Программные продукты Esri
    Мне нужно написать программу просмотра выбранных атрибутов слоя и дальнейшего сохранения их в файл CSV. Просмотр хочу осуществить при помощи listBox, но никак не могу считать таблицу атрибутов. Она записывается в один столбец, а мне нужно в несколько. Вот код который уже имеется:
public static List<string> GetAttributTable (string LayerName, string name)
    {
            IMap maps = m_doc.Maps.get_Item(0);
            int LayerIndex = GetLayerIndexByName(LayerName);
            if (LayerIndex == -1) return null;
            IFeatureLayer Flayer = maps.get_Layer(LayerIndex) as IFeatureLayer;
            IFeatureClass featureClass = Flayer.FeatureClass as IFeatureClass;
            ITable attrTable = Flayer as ITable;
            IFields fields = attrTable.Fields;
            IQueryFilter queryFilter = new QueryFilterClass();
            IFeatureCursor featureCursor = featureClass.Search(null, true);
            List<string> attributTable = new List<string>();
            ICursor cursor = attrTable.Search(queryFilter,true);
            for (IRow row = cursor.NextRow(); row != null; row = cursor.NextRow())
               {
               attributTable.Add(row.get_Value(row.Fields.FindField(name)).ToString());
               }
              
            
              
           return attributTable;

7 Ответы

0 голосов
ответил 15 Июль, 10 от TDenis (42,620 баллов)
Каким образом Вы планируете поместить таблицу в listbox?
Почему Вы не хотите вызывать этот метод для разных столбцов? Производительность не устраивает или что?
Вы точно не собираетесь экспортировать присоединённые столбцы в csv?

Как вариант - можно создавать не список строк (List<string>), а список списков строк (List<List<string>>), проходить по всем столбцам таблицы
for (int i = 0; i < pRow.Fields.FieldCount; i++)
и заполнять этот список списков.
0 голосов
ответил 15 Июль, 10 от Ilya_Zaycev (380 баллов)
в лист бокс мне нужно поместить информацию из таблицы примерно так:
id;name;adress;len;
1;bbb;ggg;123;
2;aaa;hhh;456;...
каким образом это сделать я не знаю, для этого и обратился. Пока в listbox у меня получилось вывести списком столбцы друг за другом:
id;
1;
2;
name;
bbb;
aaa;
adress;
ggg;
hhh;...
Как раз хочется вызвать этот метод для разных столбцов, но не хватает знаний чтоб осуществить....
Данный метод вызывается при помощи:
private void button2_Click(object sender, EventArgs e)
        {
            listBox2.Items.Clear();
            foreach (string str in chLB_Attrib.CheckedItems)
            {
               List<string> attributTable = ManageLayers.GetAttributTable(cmbLayer.SelectedItem.ToString(), str);
               listBox2.Items.Add(str+";");
                  foreach (string items in attributTable)
               listBox2.Items.Add(items+";" as string);
                 
            }
в другом классе

0 голосов
ответил 15 Июль, 10 от TDenis (42,620 баллов)
Всё понятно.
Отложите в сторону ArcObjects и попробуйте смоделировать ситуацию.

Пусть есть метод, который возвращает список строк:
private List<string> GetList()

Пусть есть метод, который вызывает предыдущий метод несколько раз и при этом пытается корректно слить результаты в единый список:
public List<string> ConcatListElements()

И есть метод, который тестирует всё это дело:
[TestMethod]

public void TestConcatListElements()


Убедитесь, что тест выполняется, а потом попробуйте разобраться - почему он выполняется и как это всё работает. Когда разберётесь - легко реализуете то же самое с ArcObjects.

[TestMethod]

public void TestConcatListElements()
{
    List<string> result = ConcatListElements();
    Assert.AreEqual(3, result.Count);
    Assert.AreEqual("0; 3; 6", result[0]);
    Assert.AreEqual("1; 4; 7", result[1]);
    Assert.AreEqual("2; 5; 8", result[2]);
}

public List<string> ConcatListElements()
{
    List<string> result = null;
    _counter = 0;
    for (int i = 0; i < 3; i++)
    {
        List<string> list = GetList();
        if (result == null)
            result = list;
        else
            for (int j = 0; j < list.Count; j++)
               result[j] += "; " + list[j];
    }
    return result;
}

int _counter = 0;
private List<string> GetList()
{
    var list = new List<string>();
    list.Add(_counter++.ToString());
    list.Add(_counter++.ToString());
    list.Add(_counter++.ToString());
    return list;
}


Хотя, конечно, запускать курсор несколько раз по одному и тому же слою - не самая лучшая затея.
Но возможно так проще для понимания, не знаю.
0 голосов
ответил 15 Июль, 10 от Ilya_Zaycev (380 баллов)
просто я совсем новый человек в программировании и тем более в C# и начал так сказать с места  в карьер. Дали проект в котором были уже реализованы несколько методов которые использовали курсор, используя их как примеры и состряпал свой код.:)
0 голосов
ответил 15 Июль, 10 от Ilya_Zaycev (380 баллов)
Спасибо вам за помощь! Попробую разобраться.
0 голосов
ответил 16 Июль, 10 от TDenis (42,620 баллов)
Ставьте брекпоинты и смотрите, что находится в переменных, что находится в одном списке, что в другом.
И прям по строкам (F10, F11 в VS) выполняйте код, смотрите как меняются данные.
И строго рекомендуется к прочтению какая-нибудь книжка по C#.
0 голосов
ответил 16 Июль, 10 от Ilya_Zaycev (380 баллов)
Какая нибудь имеется, но видимо не очень какая...
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...