2016-08-12 2 views
2

У меня возникли проблемы с созданием цикла foreach, который динамически создает кнопки на основе списка, который находится внутри класса NamesDA.Как создать динамические кнопки на основе arraylist

Я получаю такие ошибки, как: Невозможно преобразовать тип 'Program1.Names' в 'int'. Я испробовал все, что знаю, чтобы исправить ошибку конвертации, но я не знаю, как правильно это сделать.

Редактировать 1: allNames - это список массивов внутри NamesDA, который читает файл csv. Он возвращает список строк и int, которые затем должны использоваться для создания кнопок и их представления.

Редактировать 2: Проблема петли foreach решена сейчас, но я не могу получить значения столбца [0] для текста кнопки и столбца [1] для тега кнопки.

NamesDA класс:

private const string path = "names.csv"; 
public static List<Names> GetNames() 
{ 
    StreamReader textIn = new StreamReader(new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read)); 
    List<Names> allNames = new List<Names>(); 
    while (textIn.Peek() != -1) 
    { 
     string row = textIn.ReadLine(); 
     string[] columns = row.Split(','); 
     allNames.Add(new Names(columns[0].ToString(), Convert.ToInt16(columns[1]))); 
    } 

    textIn.Close(); 
    return allNames; 
} 

Форма:

int startTop = 20; 
int startLeft = 17; 

allNames = NamesDA.GetNames(); //calling the method in the NamesDA class 
foreach (int x in allNames) { 
    names[x] = new Button(); 
    tempButton.Text = ""; //based on the list column[0] 
    tempButton.Tag = ""; //based on the list column[1] 
    names[x].Location = new System.Drawing.Point(startTop + (x * 95), startLeft);  
    listView.Controls.Add(names[x]); 
} 
+0

какой тип 'NamesDA.GetNames()' return? какой тип «все»? –

+0

Вы назначаете 'names [x]', но вы добавляете 'allNames [x]'. – dasblinkenlight

+0

Есть несколько переменных, которые не определены в данном фрагменте ('names',' all'), можете ли вы определить их? –

ответ

1

Из обновлений ясно, что allNames является List<Names>, где Names класс содержит два свойства/поля один имеет тип int (пусть это будет _id), а другой - строки типа (пусть это будет _name). Поэтому вам нужно создать цикл следующим образом:

Обновления: вы также можете установить расположение кнопки, если вам нужно определить два целочисленных свойства в классе (пусть это будет int positionX=10 и int PositionY=30) Теперь взгляните на обновленный код:

int nextLeft=30; 

foreach (Names name in allNames) 
{ 
    Button tempButton = new Button();  
    tempButton.Name = name._id; 
    tempButton.Text = name._name; 
    tempButton.Location = new System.Drawing.Point(name.positionX + nextLeft,name.positionY); 
    listView.Controls.Add(tempButton); 
    nextLeft+=30; 
} 
+1

Да, кажется, это ответ .... –

+0

Именно это я и искал. Благодарю. –

+0

Знаете ли вы, как я мог бы установить местоположение? btn.Location = новый System.Drawing.Point (startTop + (x * 95), startLeft); его оператор say * не может применяться к операндам типов Names и 'int' –

Смежные вопросы