Использование ArrayList из другого класса без создания нового экземпляра класса - PullRequest
0 голосов
/ 06 ноября 2011

У меня была похожая проблема несколькими днями ранее, но теперь все сложнее.

Я пытаюсь использовать ArrayList из формы 2, в форме 1. Я не могу создать новый экземпляр формы 2, потому что это сделает мое содержимое формы 2 нулевым. Как я могу сделать это, изменив свой кусок кода?

Рекомендуются примеры для чайников.

Редактировать

        int totalEntries = 0;

        var myarr = SharedResources.Instance.ArrayList;


        if(cmbType.SelectedIndex == 0)
            myarr.Add(new AddPC(cmbType.Text, 
                txtUserName.Text, txtPassword.Text));

Почему приведенный выше код вызывает исключение nullreference?

private void sfdSaveToLocation_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
    EncryptDecrypt en = new EncryptDecrypt();

    StringBuilder sb = new StringBuilder();

    // I need the arraylist here but I can not access it as it is.
    foreach (var list in addWindow.addedEntry)
    {
        if (list is AddPC)
        {
            AddPC tmp = (AddPC)list;
            sb.Append(tmp.ToString());
        }
        else if (list is AddWebSite)
        {
            AddWebSite tmp = (AddWebSite)list;
            sb.Append(tmp.ToString());
        }
        else if (list is AddSerialCode)
        {
            AddSerialCode tmp = (AddSerialCode)list;
            sb.Append(tmp.ToString());
        }
    }

    File.WriteAllText(sfdSaveFile.FileName, sb.ToString());
}

У меня уже есть новый экземпляр формы AddEntryWindow:

private void tsmiAddEntry_Click(object sender, EventArgs e)
        {
            if (storedAuth == null)
            {
                DialogResult result = MessageBox.Show
                    ("You must log in before you add an entry." 
                    + Environment.NewLine + "You want to authenticate?",
                    "Information", MessageBoxButtons.YesNo, 
                    MessageBoxIcon.Information);

                if (result == DialogResult.Yes)
                {
                    AuthenticationWindow authWindow =
                        new AuthenticationWindow();
                    authWindow.ShowDialog();
                    storedAuth = authWindow.Result;

                    AddEntryWindow addWindow = new AddEntryWindow
                        (this, storedAuth.UserName, storedAuth.Password);
                    addWindow.ShowDialog();
                }
                else
                {

                }
            }
            else
            {
                AddEntryWindow addWindow = new AddEntryWindow
                    (this, storedAuth.UserName, storedAuth.Password);
                addWindow.ShowDialog();
            }
        }

Привет.

Ответы [ 2 ]

2 голосов
/ 06 ноября 2011

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

public class ShareArray
{
    private System.Collections.ArrayList arrayList;

    #region Property
    public System.Collections.ArrayList ArrayList { get{return  arrayList;}}
    #endregion

    #region Imp. signletone
    private static ShareArray instance;
    public static ShareArray Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new ShareArray();
            }
            return instance;
        }
    }


    private ShareArray()
    {
        arrayList = new System.Collections.ArrayList();
    }
    #endregion
}

и использовать этот класс в любом местетаким образом

    ShareArray.Instance.ArrayList.Add(value);

или

var myarr = ShareArray.Instance.ArrayList;
0 голосов
/ 06 ноября 2011

Одним из решений является список массивов, определяемый как Static. но это не Good Choose.

Опишите лучше дизайн вашей программы! Является ли форма 1 открытой формой 2?

...