none
Заполнение ListBox объектами из списка List и потом при выборе объекта выводить информацию о нём. RRS feed

  • Общие обсуждения

  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.IO;
    using System.Net;
    using System.Text;
    using System.Windows.Forms;
    using HtmlAgilityPack;
    
    namespace Parser
    {
        public partial class Form1 : Form
        {
            public string _logOut;
            public string _id;
            public CookieContainer cookies = new CookieContainer();
            List<UserGroup> _list = new List<UserGroup>();
    
            private ComponentResourceManager resources = new ComponentResourceManager(typeof (Form1));
    
            public Form1()
            {
                InitializeComponent();
                /* this._login.Validating += new CancelEventHandler(txtBoxEmpty_Validating);
                this._pass.Validating += new CancelEventHandler(txtBoxEmpty_Validating);
                this._login.TextChanged += new EventHandler(txtBox_TextChanged);
                this._pass.TextChanged += new EventHandler(txtBox_TextChanged);*/
            }
    
            private void ValidateAll()
            {
                buttonCnct.Enabled = ((bool) (_login.Tag) &&
                                      (bool) (_pass.Tag));
            }
    
            private void txtBoxEmpty_Validating(object sender, CancelEventArgs e)
            {
                var tb = (MaskedTextBox) sender;
    
                if (tb.Text.Length == 0)
                {
                    tb.BackColor = Color.Thistle;
                    tb.Tag = false;
                }
                else
                {
                    tb.BackColor = SystemColors.Window;
                    tb.Tag = true;
                }
    
                ValidateAll();
            }
    
    
            private void txtBox_TextChanged(object sender, EventArgs e)
            {
                var tb = (MaskedTextBox) sender;
    
                if (tb.Text.Length == 0)
                {
                    tb.Tag = false;
                    tb.BackColor = Color.Thistle;
                }
                else
                {
                    tb.Tag = true;
                    tb.BackColor = SystemColors.Window;
                }
                ValidateAll();
            }
    
            private string GET(string Url)
            {
                var reqGet = WebRequest.Create(Url);
                var resp = reqGet.GetResponse();
                var stream = resp.GetResponseStream();
                var sr = new StreamReader(stream);
                var Out = sr.ReadToEnd();
                sr.Close();
                return Out;
            }
    
            private string POST(string Url, string Data)
            {
                ServicePointManager.Expect100Continue = false;
                if (cookies == null)
                {
                    cookies = new CookieContainer();
                }
                var reqPost = (HttpWebRequest) WebRequest.Create(Url);
                reqPost.CookieContainer = cookies;
                reqPost.Method = "POST";
                reqPost.Timeout = 100000;
                reqPost.ContentType = "application/x-www-form-urlencoded";
                byte[] sentData = Encoding.UTF8.GetBytes(Data);
                reqPost.ContentLength = sentData.Length;
                var sendStream = reqPost.GetRequestStream();
                sendStream.Write(sentData, 0, sentData.Length);
                sendStream.Close();
                using (var responseStream = reqPost.GetResponse().GetResponseStream())
                using (var reader = new StreamReader(responseStream))
                {
                    string Out = reader.ReadToEnd();
                    return Out;
                }
            }
    
            private void http_auth_vk(string login, string pass)
            {
                //*****************************
                //Получаем action_url
                //*****************************
                ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
                string Out = GET("http://m.vk.com/");
    
                //*****************************
                //Парсим
                //*****************************
                var doc = new HtmlAgilityPack.HtmlDocument();
                doc.LoadHtml(Out);
                var bodyNode = doc.DocumentNode.SelectSingleNode("//div[@class='form_item fi_fat']/form");
                var _result = bodyNode.Attributes["action"].Value;
    
    
                //*****************************
                //POST запрос
                //*****************************
                string data = "email=" + login + "&pass=" + pass;
                Out = POST(_result, data);
    
    
                //*****************************
                //Парсим, поиск ID
                //*****************************                 
                doc.LoadHtml(Out);
                try
                {
                    bodyNode = doc.DocumentNode.SelectSingleNode("//h2[@class='op_header']/a");
                    labelUserInfo.Text = bodyNode.InnerText + " - ";
                    bodyNode = doc.DocumentNode.SelectSingleNode("//div[@class='ip_user_link']/a");
                    _id = bodyNode.Attributes["href"].Value.Substring(3);
                    labelUserInfo.Text += "ID " + bodyNode.Attributes["href"].Value.Substring(3);
                    bodyNode = doc.DocumentNode.SelectSingleNode("//div[@class='ip_user_link']/a/img");
                    userImg.Load(bodyNode.Attributes["src"].Value);
                    bodyNode = doc.DocumentNode.SelectSingleNode("//ul[@class='left_footer_menu']/li[4]/a");
                    _logOut = bodyNode.Attributes["href"].Value;
                    //Если ID найден, то авторизация удалась  
                    LoadGroup();
                }
                catch
                {
                    //Если ID не найден, то авторизация не удалась
                    MessageBox.Show("Авторизация не удалась. Возможно там капча=(");
                    this.buttonCnct.Enabled = true;
                    this._login.Enabled = true;
                    this._pass.Enabled = true;
                }
            }
    
            public void ListBoxInitList()
            {
                listUserGroup.Items.Clear();
                foreach (UserGroup item in _list)
                    listUserGroup.Items.Add(item.Name);
            }
    
            private void LoadGroup()
            {
                string data = "_ref=" + _id + "&_tstat=profile,38,0,266,31";
                string Out = POST("http://m.vk.com/groups", data);
    
                var doc = new HtmlAgilityPack.HtmlDocument();
                doc.LoadHtml(Out);
                HtmlNodeCollection nodes =
                    doc.DocumentNode.SelectNodes("//div[@id='gr_search_items']/a");
                foreach (var node in nodes)
                {
                    UserGroup userGroup = new UserGroup();
                    userGroup.ID = node.Attributes["href"].Value;
                    userGroup.Name = node.SelectSingleNode("div[2]/span[@class='si_owner']").InnerText;
                    userGroup.Count = node.SelectSingleNode("div[2]/div[@class='si_slabel']").InnerText;
                    _list.Add(userGroup);
                }
                ListBoxInitList();
            }
    
            private void buttonCnct_Click (object sender, EventArgs e)
            {
                // this.buttonCnct.Enabled = false;
                this._login.Enabled = false;
                this._pass.Enabled = false;
                http_auth_vk(_login.Text, _pass.Text);
                // http_auth_vk("", "");
            }
    
            private void buttonExit_Click (object sender, EventArgs e)
            {
                GET(_logOut);
                this.buttonCnct.Enabled = true;
                this._login.Enabled = true;
                this._pass.Enabled = true;
                this.userImg.Image = ((Image) (resources.GetObject("userImg.Image")));
                this.labelUserInfo.Text = "UserName - UserID";
            }
    
            public string Out { get; set; }
    
            private void listUserGroup_SelectedIndexChanged(object sender, EventArgs e)
            {
                label1.Text = listUserGroup.Name;
            }
        }
    
        public class UserGroup
        {
            public string Name { get; set; }
            public string ID { get; set; }
            public string Count { get; set; }
    
            public UserGroup(string name, string id, string count)
            {
                this.Name = name;
                this.ID = id;
                this.Count = count;
            }
            public UserGroup()
            {
    
            }
        }
    }
    Только только начал изучать С# практики никакой нет. По идее это будет парсер участников групп в контакте. На данном этапе код заносит в лист бокс все группы пользователя. Нужно при выборе любой группы из списка, сбоку выводилась информация о группе, которая содержится в полях Name, ID, Count. Буду рад любой конструктивной критике.

Все ответы

  • Увидев столько букв мало кто возьмется вникать что да как у вас работает. К тому же устаревший WinForms.

    В общем вы конкретно скажите что не получается, а мы постараемся помочь. Ну и к слову - если потратите время на изучение WPF и привязки в частности, то такие задачи будете решать на раз, два.


    VB.Net - WPF, WinRT, WP

    8 июня 2014 г. 14:24
    Отвечающий
  • У листбокса есть метод SelectedItemChanged (или как - то так). В нём получаешь выбранный айтем (в твоем примере там UserGroup.Name), далее в _list находишь объект с таким же Name, и делаешь с ним что хочешь. А потом всё переписать надо бы, как разберешься
    8 июня 2014 г. 15:23