2013-07-18 7 views
1

У меня возник вопрос, который вызывает у меня некоторые проблемы, я уверен, что это не сложно, но для меня это сейчас.C#: связь между основным классом и winforms-классом. Не могу передать данные

У меня есть два класса, один основной класс и класс моей winform.

foreach (EA.Element theElement in myPackage.Elements) 
    { 
    foreach (EA.Attribute theAttribute in theElement.Attributes) 
    { 
    attribute = theAttribute.Name.ToString(); 
    value = theAttribute.Default.ToString(); 
    AddAttributeValue(attribute, value); 
    } 
    } 

Здесь я получаю значения и попытаться записать их в Datagrid, с помощью этого метода:

private void AddAttributeValue(string attribute, string value) 
    { 
     int n = dataGridView1.Rows.Add(); 
     dataGridView1.Rows[n].Cells[0].Value = attribute; 
     dataGridView1.Rows[n].Cells[1].Value = value; 
    } 

Но компилятор говорит мне, что AddAttributeValue не в текущем контексте, и я не могу назвать Это. Я получил нужные значения, но не могу передать их в форму. Я знаю, это звучит тривиально, но я просто не могу это понять.

+1

Стандартный OOP вопрос, вам нужна ссылка на объект формы. И сделайте этот метод общедоступным. –

+0

У меня было это на публике в начале, это не проблема, а не решение, это должно быть что-то другое, но, в любом случае, спасибо. – Alika87

+0

получил, спасибо :) – Alika87

ответ

1

Make «AddAttributeValue» общественности:

public void AddAttributeValue(string attribute, string value) 

Добавление:

В соответствии мой комментарий ниже, вот как бы реализовать функцию обратного вызова, чтобы ваш главный класс для вызова метода в пределах вашего WinForm, когда он иным образом не членом экземпляра сослаться:

Ваш MainClass будет выглядеть примерно так:

public static class MainClass 
{ 
    public delegate void AddAttributeValueDelegate(string attribute, string value); 

    public static void DoStuff(AddAttributeValueDelegate callback) 
    { 
     //Your Code here, e.g. ... 

     string attribute = "", value = ""; 

     //foreach (EA.Element theElement in myPackage.Elements) 
     //{ 
     // foreach (EA.Attribute theAttribute in theElement.Attributes) 
     // { 
     //  attribute = theAttribute.Name.ToString(); 
     //  value = theAttribute.Default.ToString(); 
     //  AddAttributeValue(attribute, value); 
     // } 
     //} 
     // 
     // etc... 
     callback(attribute, value); 
    } 
} 

то в классе Winform, вы бы вызвать метод следующим образом:

MainClass.DoStuff(this.AddAttributeValue); 

Это будет означать, что, когда завершается «DoStuff», метод называется «AddAttributeValue» вызывается.

+0

спасибо, но это не решение, у меня было это и на публике. проблема в другом. – Alika87

+1

Еще раз взглянув на ваш код, похоже, вы пытаетесь вызвать член экземпляра в другом классе, но у вас нет экземпляра для ссылки. Ваш код ищет метод «AddAttributeValue» внутри вашего основного класса. Вам либо нужно получить экземпляр вашей winform, либо обратиться к * своей * реализации 'AddAttributeValue', либо сделать AddAttributeValue статическим и обратиться к нему через MyWinformClass.AddAttributeValue. (NB: если вы делаете второй, могут возникнуть проблемы с доступом к конкретным экземплярам вашего класса winform, например, к вашему члену dataGridView1). – Deleted

+0

Вместо этого я бы рекомендовал передать обратный вызов в ваш основной класс. Я дам еще один ответ за минуту, демонстрирующий эту идею на работе. – Deleted

1

Если я понял, предоставленные фрагменты кода находятся в разных классах.

В этом случае метод должен быть общедоступным.

Как что:

public void AddAttributeValue(string attribute, string value) 
{ 
    int n = dataGridView1.Rows.Add(); 
    dataGridView1.Rows[n].Cells[0].Value = attribute; 
    dataGridView1.Rows[n].Cells[1].Value = value; 
} 
Смежные вопросы