Задать вопрос
Morpheus_God
@Morpheus_God

Передача списка друзей в другую форму.Update. Как сделать?

Добрый день. Пробую написать программу с библиотекой VkNet. Простой мессенджер, который позволит отправлять и получать сообщение друзьям ВКонтакте.
------------------------------------
Небольшой апдейт вопроса.
Было решено поместить все что связано с VkNet в отдельный класс.
using System;
using System.Windows.Forms;
using VkNet;
using VkNet.Enums.Filters;
using VkNet.Exception;

namespace vkmessenger
{
    public class Auth
    {
        VkApi vk = new VkApi();
        Settings scope = Settings.All;

        public void GetAuth(string login,string pass, int AppID)
        {
            try
            {
                vk.Authorize(new ApiAuthParams
                {
                    ApplicationId = AppID,
                    Login = login,
                    Password = pass,
                    Settings = scope
                });
            }
            catch(Exception ex)
            {

            }
        }
        public void GetFriendList(ListBox lb)
        {
                var friends = vk.Friends.Get(vk.UserId.Value, ProfileFields.FirstName | ProfileFields.LastName);
                foreach (var friend in friends)
                {
                    lb.Items.Add(friend.FirstName + " " + friend.LastName);
                }
        }
    }
}

На форме авторизации я сделал так.
using System;
using System.Windows.Forms;
using VkNet;
using VkNet.Enums.Filters;
using VkNet.Exception;

namespace vkmessenger
{
    public partial class Form1 : Form
    {
        Auth auth = new Auth();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
                auth.GetAuth(tbLogin.Text, tbPassword.Text, tbID);
                FrndList FrndList = new FrndList();
                FrndList.Owner = this;
                FrndList.Show();
                Hide();
        }
    }
}


И получить список друзей в другой форме
using System;
using System.Windows.Forms;
using VkNet;
using VkNet.Enums.Filters;
using VkNet.Exception;


namespace vkmessenger
{
    public partial class FrndList : Form
    {
        Auth auth = new Auth();

        public FrndList()
        {
            InitializeComponent();
        }
    private void FrndList_Load(object sender, EventArgs e)
        {
            auth.GetFriendList(lbFriends);
        }
        private void FrndList_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();
        }
    }
}

Но не работает. Я понимаю в чем вероятная ошибка. На второй форме я опять создаю экземпляр который не имеет данных из первой формы об авторизации. Как выйти из ситуации, как передать в другую форму информацию о том, что уже создан экземпляр класса и работать надо с экземпляром из первой формы? Если пробовать создать static класс для авторизации, то IDE ругается "Нельзя объявлять члены экземпляра в статическом классе" оно в принципе и понятно. Что можно применить?
  • Вопрос задан
  • 177 просмотров
Подписаться 1 Оценить 2 комментария
Решения вопроса 1
Dyaminigo
@Dyaminigo
Сделайте экземпляр VkApi статическим, тогда и класс Auth и его методы можно сделать таковыми и всё будет работать:
public static VkApi vk = new VkApi();
Но если же, по каким-то причинам, у Вас это не получается, то Вы можете пойти другим путём.
Создайте статический экземпляр класса Auth в Program.cs.
// Где-нибудь за методом Main(), к примеру.
public static Auth authVk = new Auth();
Далее, в обработчике события button1_Click вызовите нужный Вам метод авторизации:
Program.authVk.GetAuth(tbLogin.Text, tbPassword.Text, tbID);
Я бы сделал bool возвращаемым значением метода GetAuth, чтобы ориентироваться на то, прошла ли авторизация или нет и открывать ли окно показа списка друзей или нет. А в обработчике что-то вроде этого:
if(!Program.authVk.GetAuth(tbLogin.Text, tbPassword.Text, tbID))
MessageBox.Show("Авторизация не прошла. Крепитесь!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
FrndList FrndList = new FrndList();
FrndList.Show();
Hide();
И, в данной ситуации, уже не потребуется передавать владельца " FrndList.Owner = this;", т.к. у нас есть уже статическое поле с авторизованным экземпляром класса, что нам позволит просто в обработчике события загрузки формы списка друзей показать этот список без танцев с бубном:
privatevoidFrndList_Load(object sender, EventArgs e)
{
Program.authVk.GetFriendList(lbFriends);
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы