2015-10-15 5 views
-1

У меня есть следующий класс ...GetEnumerator Ошибка с пользовательским типом

class gridRecord 
{ 
    //Constructor 
    public gridRecord() 
    { 
     Quantity = new quantityField(); 
     Title = new titleField(); 
     Pages = new pagesField(); 
    } 
    private quantityField quantity; 
    private titleField title; 
    private pagesField pages; 



    internal quantityField Quantity 
    { 
     get { return quantity; } 
     set { quantity = value; } 
    } 

    internal titleField Title 
    { 
     get { return title; } 
     set { title = value; } 
    } 

    internal pagesField Pages 
    { 
     get { return pages; } 
     set { pages = value; } 
    } 
} 

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

List<gridRecord> lgr = new List<gridRecord>(); 
lgr = populatedList(); 

foreach(gridField gf in lgr[0]) 
    MessageBox.Show(gf.ToString()); 

Но я получаю эту ошибку:

Error 1 foreach statement cannot operate on variables of type 'XML__Console.gridRecord' because 'XML__Console.gridRecord' does not contain a public definition for 'GetEnumerator'

Я полагаю, мне нужно, чтобы наследовать форму и интерфейс или что-то, но не уверен, как или какой.

Сетка поле Добавлено ...

class gridField : Validateit 
{ 
    public gridField() 
    { 
     Value = "---"; 
     isValid = false; 
     message = ""; 
    } 
    private string value; 
    protected bool isValid; 
    private string message; 

    public string Value 
    { 
     get { return this.value; } 
     set { this.value = value; } 
    } 
    public bool IsValid 
    { 
     get { return isValid; } 
     set { isValid = value; } 
    } 
    public string Message 
    { 
     get { return message; } 
     set { message = value; } 
    } 
    public override void Validate() 
    { 

    } 
} 

quantityField добавил ниже других полей так же

class quantityField : gridField 
    { 

     public void validate() 
     {    
      if (isQuantityValid(Value) == false) { Value = "Invalid";}   
     } 

     public static bool isQuantityValid(string quantity) 
     { 

      if (quantity.Length > 3) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 

    } 
+0

IEnumerable - https://msdn.microsoft.com/en-us/library/system.collections.ienumerable(v=vs.110).aspx –

+0

вы можете дать более подробную информацию? – GasDev

+0

Как в стороне C# позволяет ваши свойства быть похожими на это внутреннее значение Количество элементов {get; set;} –

ответ

3

Из того, что я понял, вы хотите, чтобы получить имя свойства из gridRecord класса (из вашего примера: «Количество», «Название», «Страницы»)?

Для этого вам нужно использовать Reflection:

var properties = typeof(gridRecord).GetProperties(); 
foreach (PropertyInfo propInfo in properties) { 
    MessageBox.Show(propInfo.Name); 
} 
+1

. Также стоит отметить, что атрибуты могут использоваться, если вы хотите, чтобы отображаемое имя не было таким же, как имя свойства. – Chris

1

Вы пытаетесь перебирать один из элементов коллекции.

foreach(gridField gf in lgr[0]) 
{ 
    MessageBox.Show(gf.ToString()); 
} 

Если ваша цель - получить имя каждого свойства внутри класса, сделайте это.

PropertyInfo[] props = typeof(gridRecord).GetProperties(); 
foreach(PropertyInfo prop in props) 
{ 
    object[] attrs = prop.GetCustomAttributes(true); 
    foreach(object attr in attrs) 
    { 
     AuthorAttribute authAttr = attr as AuthorAttribute; 
     if (authAttr != null) 
     { 
      string propName = prop.Name; 
      string auth = authAttr.Name; 
     } 
    } 
} 
+1

Из исходного сообщения «Я хочу иметь возможность получить имя каждого поля в виде строки». OP не хочет перебирать поля в 'gridRecord'. – Chris

+1

Нет - я думаю, что они пытаются перебирать поля в классе.Кому нужен счетчик –

+0

Да, в основном, я хочу, чтобы добавить новое поле, скажите «Цена», добавив новый класс для этого поля и добавив поле в Grid_Record. поэтому в конечном итоге мой datagridview будет адаптироваться к включенным полям. – user3755946

0

Если вы хотите, чтобы получить имя каждого поля, которое следует использовать reflection.
PropertyInfo класс должен быть полезным

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