2017-01-27 3 views
0

У меня есть класс, который имеет несколько списков. Название этого класса: Trans. Я хочу использовать эти списки в других формах, но я не могу их назвать. когда я делаю из них объект Trans мои списки сброшены. Как я могу использовать эти списки во всех формах моего проекта ?!передать список в другую форму

(я так себе Извините за плохой английский)

class Trans 
{ 
    public static List<string> name_list = new List<string>(); 
    public static List<string> family_list = new List<string>(); 
    public static List<string> phoneno_list = new List<string>(); 

    public List<string> name_Sec_list { set { name_list = value; } get { return name_list; } } 
    public List<string> family_Sec_list { set { name_list = value; } get { return name_list; } } 
    public List<string> phoneno_Sec_list { set { name_list = value; } get { return name_list; } } 
} 

и форма 1

Trans data = new Trans(); 
data.name_Sec_list.Add(name.Text); 
data.family_Sec_list.Add(name.Text); 
data.phoneno_Sec_list.Add(name.Text); 

Когда я на form2 и Wanna использовать свои списки я не могу Так что я должен сделать объект из класса Trans, и эта работа будет сделать список значений null

+1

Сделать этот класс или списки статическими и использовать ваши списки как: 'Trans.name_list', не создавая' new Trans() ' –

+0

@MarkBenovsky Какой класс должен быть статическим? –

+0

'public static class Trans', или вы можете сделать все свои списки' static' как 'name_list' –

ответ

0

вы могли бы использовать одноплодный шаблон:

class Trans { 

    private static Trans instance; 

    private Trans() { } 

    public static Trans Instance() { 
     if (instance == null) { 
      instance = new Trans(); 
     } 
     return instance; 
    } 
    ... 
} 

использовать его в первой форме:

Trans trans = Trans.Instance(); 
trans.name_Sec_list .... 

использовать его во второй форме:

Trans trans = Trans.Instance(); 
trans.name_Sec_list .... 
+0

Singletons - это своего рода анти- и не так сильно отличается от статических элементов. Синглтоны можно использовать повсюду, поощряя код спагетти. –

+1

@ThomasWeller Вопрос в том, как данные/объект могут быть переданы в другую форму, это только одно возможное решение (никогда не говорило, что это идеальное решение). –

-1

У вас есть 3 статические списки в Trans классе уже, если вы хотите использовать их делают другие также статические:

public class Trans 
{ 
    public static List<string> name_list = new List<string>(); 
    public static List<string> family_list = new List<string>(); 
    public static List<string> phoneno_list = new List<string>(); 

    public static List<string> name_Sec_list = new List<string>(); 
    public static List<string> family_Sec_list = new List<string>(); 
    public static List<string> phoneno_Sec_list = new List<string>(); 
} 

Тогда везде, где вы хотите использовать эти списки, вы должны им подобные:

Trans.name_Sec_list.Add(name.Text); 

Теперь вы можете использовать эти списки в любой форме, в которой хотите.

+0

Я не буду использовать свой список как общедоступный. –

-1

Просто используйте статический класс

public static class Trans 
    { 
     public static List<string> name_list = new List<string>(); 
     public static List<string> family_list = new List<string>(); 
     public static List<string> phoneno_list = new List<string>(); 
    } 

Usage

Trans.name_list.Add(string); 

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

+0

Все должно быть статическим по умолчанию в .NET в любом случае. Гораздо удобнее иметь глобальный доступ ко всему. –

+0

И что заслуживает голосования? – Wheels73

+0

Почему бы и нет? Я думаю, что это «не полезно», и это именно то, что описано в описании стрелки вниз. –

0

Как было предложено другими, быстрое решение может заключаться в том, чтобы сделать свойства статическими. Однако это, скорее всего, вызовет новые проблемы, такие как тестируемость, и нарушит принципы чистого кода.

Подход Singleton уже лучше, поскольку вы можете потенциально настроить его для возврата тестового объекта для модульных тестов. Однако получение Singleton требует статического метода, который может снова быть вызван повсеместно.

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

Вы точно не указали, сколько форм у вас есть, как они открываются и т. Д., Поэтому мне нужно будет сделать некоторые предположения.

Основной метод может выглядеть следующим образом:

[STAThread] 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    var data = new Trans(); 
    var secondForm = new Form2 {Trans = data}; 
    var mainForm = new Form1 {SubForm = secondForm, Trans = data }; 
    Application.Run(mainForm); 
} 

И я изменил класс Trans так, что он не имеет статические элементы больше. Я также исправил этот класс, потому что у IMHO была проблема с копией/вставкой. Вполне вероятно, что вы внедрили все файлы _Sec_ для тестирования, поэтому их можно, вероятно, удалить (они возвращают один и тот же объект, что не решает каких-либо проблем).

class Trans 
{ 
    public List<string> name_list = new List<string>(); 
    public List<string> family_list = new List<string>(); 
    public List<string> phoneno_list = new List<string>(); 

    public List<string> name_Sec_list { set { name_list = value; } get { return name_list; } } 
    public List<string> family_Sec_list { set { family_list = value; } get { return family_list; } } 
    public List<string> phoneno_Sec_list { set { phoneno_list = value; } get { return phoneno_list; } } 
} 

Что вы видите здесь?

  • оба Form1 и Form2 имеют доступ к данным, поэтому он решает вашу проблему.
  • Main() способ имеет контроль над тем, кто получает какие данные. Все, кому нужны эти данные, получают данные.
  • Никто не получает доступ к данным. В то время как каждый мог new сам Trans, это было бы просто пусто.
  • Поскольку нет ничего static больше, вы можете смело использовать new экземпляры Trans во время модульных тестов без каких-либо побочных эффектов
  • формы не создает их зависимости самой. Зависимость теперь вводится в форму. Это позволяет заменить его макетным объектом с определенным тестовым поведением в единичном тесте. (Еще один вопрос: следует ли тестировать пользовательские интерфейсы в модульных тестах, но это другая тема).
+0

Я не буду использовать список как общедоступный. –

+1

Я вижу. Я полагаю, что если у вас есть большее количество форм, они могут быть установлены через фабрику форм, которая в конечном итоге может управлять инъекцией класса trans. спасибо – Wheels73

+0

@MamadFr: возможно, правда. Я не хотел слишком сильно модифицировать код OP. –

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