Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
1 / 1 / 6
Регистрация: 26.04.2009
Сообщений: 234

Как сделать ссылку на строку в DataGrid?

17.06.2011, 10:35. Показов 3769. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходимо сделать гиперссылку на строку в DataGrid. Как это можно сделать?

Добавлено через 11 часов 4 минуты
Маленько не так выразился...
как сделать, чтобы по клику на определенную строку в DataGridView открывалась ссылка соответствующая этой строке?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.06.2011, 10:35
Ответы с готовыми решениями:

Как сделать видимой последнюю добавленную строку в datagrid
Уважаемые Гуру! После добавления строки в viewModel последняя добавленная строка не видима в DataGrid. Как сделать ее видимой? ...

DataGrid: установить фокус на строку DataGrid, а не на сам DataGrid
Добрый день! Есть следующий код: public partial class MainWindow : Window { DataTable dt = new DataTable(); ...

Как в adobe flash сделать ссылку на другой .swf файл? Не интернет ссылку,а простую ссылку на другой файл!
Помогите!!! Как в adobe flash сделать ссылку на другой .swf файл? Не интернет ссылку,а простую ссылку на другой файл!

18
 Аватар для ushim
179 / 180 / 55
Регистрация: 01.06.2011
Сообщений: 507
17.06.2011, 10:44
В настройках DGV сделай возможность выбирать целую строки и при этом только одну.
Чтобы получить данные из выбранной строки, делай вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
string[] Rows= null;
                    foreach (DataGridViewRow dr in dgvTable.SelectedRows)
                    {
                        Rows = new string[4]
                        {
                        dr.Cells[0].Value.ToString(),
                        dr.Cells[1].Value.ToString(),
                        dr.Cells[2].Value.ToString(),
                        dr.Cells[3].Value.ToString()
                        };
                    }
Так ты получишь данные из таблицы, в которой 4 столбца. Измени количество элементов в массиве Rows на своё. А дальше используй for & if для проверки строк
0
179 / 175 / 14
Регистрация: 17.01.2011
Сообщений: 349
17.06.2011, 10:47
Вообще клик по ячейке отрабатывается в событии CellContentClick соответственно, а в качестве данных это событие отдает в том числе координаты клика (столбец и строку). А перейти к нужной ячейке вообще проще простого.
Другое дело, в каком виде хранить информацию о ячейке, в которую надо перейти.
Вы пример, в котором это надо реализовать, можете дать?
0
1 / 1 / 6
Регистрация: 26.04.2009
Сообщений: 234
17.06.2011, 10:52  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
void webmoney()
        {
            // Адрес сайта с курсом валюты
            string url2 = "http://www.bestchange.ru/wmr-to-wmz.html";
            // HTML сайта с курсом валюты
            string html2 = string.Empty;
 
            // Регулярное выражение
            string[] pattern2 = {
                                    
                                "WMCasher</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "ChangeMoney</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "Exchanger39</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "WMtoCash</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "DemonChange</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "MegaExchange</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "SairosXchange</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "IntExchange</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "EasyChange</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "SuperChange</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "Changer</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "Cashing</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "Currex</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "Меняла</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "Обменов</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "Ewm24</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "NetExchange</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "N-Change</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "WebObmen</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "Обменник.ру</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "Обменник.ws</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class",
                                "Клад.ее</a></td><td class=\"bi\">(.*)<small>WMR</small></td>\n<td class=\"bi\">(.*)<small>WMZ</small></td>\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>\n<td class" };
 
            string[] obmen = { "WMCasher", "ChangeMoney", 
                                 "Exchanger39", "WMtoCash", 
                                 "DemonChange", "MegaExchange", 
                                 "SairosXchange", "IntExchange", 
                                 "EasyChange", "SuperChange", "Changer", 
                                 "Cashing", "Currex", "Меняла", "Обменов", 
                                 "Ewm24", "NetExchange", "N-Change", 
                                 "WebObmen", "Обменник.ру", "Обменник.ws", "Клад.ее" };
 
            string[] otdacha = new string[22];
            string[] poluchka = new string[22];
            string[] reserv = new string[22];
            string[] bl = new string[22];
 
            // string pattern2 = "WMCasher</a></td><td class=\"bi\">(.*)<small>(.*)</small></td>\r\n<td class=\"bi\">(.*)<small>(.*)</small></td>\r\n<td class=\"ar\">(.*)</td><td class=\"ar\">(.*)</td>";
 
            // Отправляем GET запрос и получаем в ответ HTML-код сайта с курсом валюты
            HttpWebRequest myHttpWebRequest2 = (HttpWebRequest)HttpWebRequest.Create(url2);
            HttpWebResponse myHttpWebResponse2 = (HttpWebResponse)myHttpWebRequest2.GetResponse();
            StreamReader myStreamReader2 = new StreamReader(myHttpWebResponse2.GetResponseStream());
            html2 = myStreamReader2.ReadToEnd();
 
            // Вытаскиваем из HTML-кода нужные данные
         //   Match match2 = Regex.Match(html2, pattern2);
 
            dataGridView3.RowCount = 1;
 
            
            for (int i = 0; i < 22; i++)
            {
                Match match2 = Regex.Match(html2, pattern2[i]);
                otdacha[i] = match2.Groups[1].ToString();
                poluchka[i] = match2.Groups[2].ToString();
                reserv[i] = match2.Groups[3].ToString();
                bl[i] = match2.Groups[4].ToString();
 
 
                this.dataGridView3.Rows.Add(new object[] { obmen[i], otdacha[i] + " WMR", poluchka[i] + " WMZ", reserv[i], bl[i] }); 
            }
 
        
        }
Вот функция которая парсит... и на каждую строку надо присвоить ссылку

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

C#
1
2
3
4
5
 private void dataGridView3_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
           System.Diagnostics.Process.Start("explorer", "http://www.vkontakte.ru");
 
        }
0
179 / 175 / 14
Регистрация: 17.01.2011
Сообщений: 349
17.06.2011, 11:18
steve09, код такой... суровый
Я изначально не совсем правильно понял, что нужно. Если требуется просто открыть ссылку в браузере, то все просто:
C#
1
2
3
4
5
private void dataGridView3_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
             string url = (string)dataGridView3.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
             System.Diagnostics.Process.Start("explorer", url);
        }
Т.е. мы получаем координаты ячейки, заносим значение из нее в url, затем переходим по этой ссылке во внешнем браузере. Учти, что нужно еще добавить проверку столбца (чтобы клики срабатывали только там, где ссылки).

А вообще я правильно понимаю - требуется ту таблицу с сайта в программе отобразить?
0
1 / 1 / 6
Регистрация: 26.04.2009
Сообщений: 234
17.06.2011, 11:26  [ТС]
Цитата Сообщение от Slap Посмотреть сообщение
А вообще я правильно понимаю - требуется ту таблицу с сайта в программе отобразить?
Да все верно) Только не особо понял как ссылки то задать... Урлов то у нас в таблице нет...

А что в коде сурового?))) Ответ "переписать все" не принимается)) Я только учусь...
0
615 / 539 / 115
Регистрация: 24.03.2011
Сообщений: 576
17.06.2011, 11:27
Slap, создайте например список, в котором будете хранить ссылки:
C#
1
        List<string> URLlist = new List<string>();
заполняете его, в соответствии с вашей таблицей:
C#
1
2
3
        URLlist.Add("url1");
        URLlist.Add("url2");
        URLlist.Add("url3");
открываете:
C#
1
2
3
4
        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            System.Diagnostics.Process.Start("explorer", URLlist[e.RowIndex]);
        }
1
179 / 175 / 14
Регистрация: 17.01.2011
Сообщений: 349
17.06.2011, 12:34
Redfex, тогда уж лучше словарь использовать, поскольку при сортировке индексы то поменяются

steve09, я понимаю, что начинаете только, просто с таким кодом добавление любой новой функции будет превращаться в строгание костылей перочинным ножом. Надо сразу учиться писать понятный и расширяемый код, хотя бы стараться.
Что будет, если на сайте добавят или удалят обменник? Код будет выдавать кучу ошибок. А если при запуске не будет интернета? Программа будет вываливаться. А если вы нажали кнопку, вроде все нормально, а в таблице ничего нет? Это на сайте что то изменилось или парсинг не сработал или другая ошибка?

В общем, чтобы не быть голословным, накидал тут в перерыве пример. Старался никаких крутых технологий не примерять, все откомментировал. Из наверняка неизвестного тебе используются словари (почитать на MSDN), более грамотно используются регулярки, сделаны банальные проверки на ошибки.

Вот листинг:
Посмотреть код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Diagnostics;
 
namespace GetWebmoney
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        //Создаем словарь, в который будем заносить имя ресурса и ссылку
        Dictionary<string, string> urlByName = new Dictionary<string, string>();
 
        /* [кодировки]:[их код]
        * windows-1251 : 1251
        * utf-8 : 65001
        * koi8-r : 20866 
        * На MSDN: [url]http://msdn.microsoft.com/ru-ru/library/system.text.encoding.aspx[/url]
        */
 
        string http(string uri, int codepage)
        {
            StreamReader reader;
            HttpWebRequest httpWebRequest;
            HttpWebResponse httpWebResponse;
 
            try
            {
                httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(uri);
                httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
                reader = new StreamReader(httpWebResponse.GetResponseStream(), Encoding.GetEncoding(codepage));
                return reader.ReadToEnd();
            }
            catch
            {
                return "error";
            }
        }
 
        void getWebmoney()
        {
            //Страница, с которой мы будем парсить курсы
            string url = "http://www.bestchange.ru/wmr-to-wmz.html";
 
            //Общая регулярка для всей таблицы
            Regex r = new Regex(@"href=""(?<url>.*?)"" onclick=""return fco\(\)"" target=""_blank"">(?<charger>.*?)</a></td><td class=""bi"">(?<from>.*?)<small>WMR</small></td>\n<td class=""bi"">(?<to>.*?)<small>WMZ</small></td>\n<td class=""ar"">(?<res>.*?)</td><td class=""ar"">(?<bl>.*?)</td>\n<td class", RegexOptions.Compiled);
 
            //Получаем страницу, проверяем на ошибку загрузки
            string page = http(url, 1251);
            if (page == "error")
                MessageBox.Show("Ошибка при получении страницы, проверьте соединение и доступность сайта.");
            else
            {
                //Получаем значения всех строк из таблицы
                MatchCollection allRows = r.Matches(page);
                if (allRows.Count == 0)
                    MessageBox.Show("Внимание, не найдено ни одного соответствия!");
 
                //Очищаем словарь от старых значений
                urlByName.Clear();
                
                //Заполняем нашу таблицу и заносим значения в словарь
                foreach (Match row in allRows)
                {
                    urlByName.Add(row.Groups["charger"].Value, row.Groups["url"].Value);
                    wmTable.Rows.Add(
                        row.Groups["charger"].Value,
                        row.Groups["from"].Value,
                        row.Groups["to"].Value,
                        row.Groups["res"].Value,
                        row.Groups["bl"].Value
                        );
                }
            }
        }
 
        private void loadBtn_Click(object sender, EventArgs e)
        {
            //Очищаем таблицу перед заполнением
            wmTable.Rows.Clear();
 
            //Заполняем
            getWebmoney();
        }
 
        private void wmTable_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            //Обрабатываем клик по ячейке с названием ресурса
            //Проверяем, не заголовок ли был нажат и название столбца
            if (e.RowIndex != -1 && e.ColumnIndex == wmTable.Columns["changer"].Index)
            {
                //По строке и столбцу вытаскиваем название
                string name = (string)wmTable.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
                //Извлекаем ссылку по ключу и открываем браузером
                string url = urlByName[name];
                Process.Start("iexplore.exe", url);
            }
        }
    }
}


Проект целиком на VS2010: http://dl.dropbox.com/u/11918263/GetWebmoney.zip
А это исполняемый файл: http://dl.dropbox.com/u/11918263/GetWebmoney.exe

Если будут вопросы - пиши в личку или сюда.
1
1 / 1 / 6
Регистрация: 26.04.2009
Сообщений: 234
17.06.2011, 14:38  [ТС]
Спасибо громадное) Сегодня вечерком поразбираюсь
0
15 / 15 / 1
Регистрация: 08.06.2011
Сообщений: 34
17.06.2011, 16:57
Еще вроде бы есть тип колонки, в которой может быть ссылка.
При клике - ссылка, если есть, открывается браузером. Если это нужно было - могу пример дома посмотреть
0
1 / 1 / 6
Регистрация: 26.04.2009
Сообщений: 234
17.06.2011, 19:25  [ТС]
Цитата Сообщение от devstart Посмотреть сообщение
Еще вроде бы есть тип колонки, в которой может быть ссылка.
При клике - ссылка, если есть, открывается браузером. Если это нужно было - могу пример дома посмотреть
Если можете, посмотрите пожалуйста... Посмотрю как лучше будет сделать...
0
179 / 175 / 14
Регистрация: 17.01.2011
Сообщений: 349
17.06.2011, 19:45
devstart, вы не совсем правильно помните. Действительно, можно сделать столбец как ссылки, но они не будут сами открываться браузером, так же придется обрабатывать клик. Единственное отличие в том, что выглядеть ссылка будет как ссылка.
0
15 / 15 / 1
Регистрация: 08.06.2011
Сообщений: 34
17.06.2011, 21:49
Именно так.
Признаться, как-то даже мысли не возникло что все само должно произойти. Но можно свой тип колонки создать, там расширение небольшое.

Вот пример:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// объявление типа колонки
private DataGrid.DataGridTextBoxColumn dgcContactValue;
...
// на форме добавляем обработчик клика в колонке
this.dgcContactValue.ColumnTextBox.DoubleClick += new EventHandler(ColumnTextBox_DoubleClick);
...
 
// собственно сам обработчик клика
private void ColumnTextBox_DoubleClick(object sender, EventArgs e)
{
    OnClickOnContact();
}
 
void OnClickOnContact()
{
// тут типизированный датасет, краткий смысл этой длинной операции - получаем саму ссылку
System.Data.DataRowView rowView = (System.Data.DataRowView)this.dgContacts.BindingManager.Current;
            PartnerPropertiesDataSet.Crm_V_Partners_ContactsRow row 
                = (PartnerPropertiesDataSet.Crm_V_Partners_ContactsRow)rowView.Row;
 
System.Diagnostics.Process es;
// если тип контакта - ссылка, то запускаем в браузере. Проверку нужно делать такую, которая будет работать именно в Вашем случае
if(row.n_ref_contact_kind_id == (decimal)ContactKinds.Internet)
{
    es = System.Diagnostics.Process.Start(row.vc_code);
    return;
}
}
Для наглядности вырезал всю проверку на пустые строки и всю обработку ошибок.
Примерно так же реализуется код, в котором курсор изменяется, при наведении на ссылку. Суть примерно та же, привязываться нужно к событию грида MouseMove
Заметил, что здесь используется свой класс колонки. Для обычной колонки все будет точно такое же.
0
1 / 1 / 6
Регистрация: 26.04.2009
Сообщений: 234
19.06.2011, 22:57  [ТС]
возникла проблема при суммировании всех данных столбца "резерв". Помогите, пжл
0
 Аватар для ushim
179 / 180 / 55
Регистрация: 01.06.2011
Сообщений: 507
19.06.2011, 23:15
форичем обходишь таблицу, если значение клетки null, делай "0". Потом через double.Parce() получай число.
C#
1
сумма += число.
0
1 / 1 / 6
Регистрация: 26.04.2009
Сообщений: 234
20.06.2011, 22:36  [ТС]
Цитата Сообщение от Slap Посмотреть сообщение
Redfex, тогда уж лучше словарь использовать, поскольку при сортировке индексы то поменяются

steve09, я понимаю, что начинаете только, просто с таким кодом добавление любой новой функции будет превращаться в строгание костылей перочинным ножом. Надо сразу учиться писать понятный и расширяемый код, хотя бы стараться.
Что будет, если на сайте добавят или удалят обменник? Код будет выдавать кучу ошибок. А если при запуске не будет интернета? Программа будет вываливаться. А если вы нажали кнопку, вроде все нормально, а в таблице ничего нет? Это на сайте что то изменилось или парсинг не сработал или другая ошибка?

В общем, чтобы не быть голословным, накидал тут в перерыве пример. Старался никаких крутых технологий не примерять, все откомментировал. Из наверняка неизвестного тебе используются словари (почитать на MSDN), более грамотно используются регулярки, сделаны банальные проверки на ошибки.

Вот листинг:
Посмотреть код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Diagnostics;
 
namespace GetWebmoney
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        //Создаем словарь, в который будем заносить имя ресурса и ссылку
        Dictionary<string, string> urlByName = new Dictionary<string, string>();
 
        /* [кодировки]:[их код]
        * windows-1251 : 1251
        * utf-8 : 65001
        * koi8-r : 20866 
        * На MSDN: [url]http://msdn.microsoft.com/ru-ru/library/system.text.encoding.aspx[/url]
        */
 
        string http(string uri, int codepage)
        {
            StreamReader reader;
            HttpWebRequest httpWebRequest;
            HttpWebResponse httpWebResponse;
 
            try
            {
                httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(uri);
                httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
                reader = new StreamReader(httpWebResponse.GetResponseStream(), Encoding.GetEncoding(codepage));
                return reader.ReadToEnd();
            }
            catch
            {
                return "error";
            }
        }
 
        void getWebmoney()
        {
            //Страница, с которой мы будем парсить курсы
            string url = "http://www.bestchange.ru/wmr-to-wmz.html";
 
            //Общая регулярка для всей таблицы
            Regex r = new Regex(@"href=""(?<url>.*?)"" onclick=""return fco\(\)"" target=""_blank"">(?<charger>.*?)</a></td><td class=""bi"">(?<from>.*?)<small>WMR</small></td>\n<td class=""bi"">(?<to>.*?)<small>WMZ</small></td>\n<td class=""ar"">(?<res>.*?)</td><td class=""ar"">(?<bl>.*?)</td>\n<td class", RegexOptions.Compiled);
 
            //Получаем страницу, проверяем на ошибку загрузки
            string page = http(url, 1251);
            if (page == "error")
                MessageBox.Show("Ошибка при получении страницы, проверьте соединение и доступность сайта.");
            else
            {
                //Получаем значения всех строк из таблицы
                MatchCollection allRows = r.Matches(page);
                if (allRows.Count == 0)
                    MessageBox.Show("Внимание, не найдено ни одного соответствия!");
 
                //Очищаем словарь от старых значений
                urlByName.Clear();
                
                //Заполняем нашу таблицу и заносим значения в словарь
                foreach (Match row in allRows)
                {
                    urlByName.Add(row.Groups["charger"].Value, row.Groups["url"].Value);
                    wmTable.Rows.Add(
                        row.Groups["charger"].Value,
                        row.Groups["from"].Value,
                        row.Groups["to"].Value,
                        row.Groups["res"].Value,
                        row.Groups["bl"].Value
                        );
                }
            }
        }
 
        private void loadBtn_Click(object sender, EventArgs e)
        {
            //Очищаем таблицу перед заполнением
            wmTable.Rows.Clear();
 
            //Заполняем
            getWebmoney();
        }
 
        private void wmTable_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            //Обрабатываем клик по ячейке с названием ресурса
            //Проверяем, не заголовок ли был нажат и название столбца
            if (e.RowIndex != -1 && e.ColumnIndex == wmTable.Columns["changer"].Index)
            {
                //По строке и столбцу вытаскиваем название
                string name = (string)wmTable.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
                //Извлекаем ссылку по ключу и открываем браузером
                string url = urlByName[name];
                Process.Start("iexplore.exe", url);
            }
        }
    }
}


Проект целиком на VS2010: http://dl.dropbox.com/u/11918263/GetWebmoney.zip
А это исполняемый файл: http://dl.dropbox.com/u/11918263/GetWebmoney.exe

Если будут вопросы - пиши в личку или сюда.
Как мне добавить свои ссылки в словарь... Мне необходимы другие ссылки, нежели которые мы спарсили с сайта.
0
179 / 175 / 14
Регистрация: 17.01.2011
Сообщений: 349
21.06.2011, 11:59
steve09, читайте MSDN, Шилдта и Троелсена.
В данном случае, чтобы поменять ссылку на сайт по названию:
C#
1
urlByName["ключ"] = значение;
Добавить еще сайт:
C#
1
urlByName.Add("ключ", "значение");
1
1 / 1 / 6
Регистрация: 26.04.2009
Сообщений: 234
21.06.2011, 23:24  [ТС]
Не пойму почему не парсит вот с этой страницы: http://www.bestchange.ru/wmz-to-wmr.html
вроде бы регулярка та же самая
0
179 / 175 / 14
Регистрация: 17.01.2011
Сообщений: 349
22.06.2011, 11:44
steve09, WMZ и WMR поменяйте местами
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.06.2011, 11:44
Помогаю со студенческими работами здесь

Удалить выбранную строку в DataGrid, если DataGrid содержит коллекцию
Здравствуйте! Скажите пожалуйсто, как удалить выбраную строку в DataGrid, если DataGrid содержит коллекцию. пример выражения: //Метод ...

Как раскрасить строку в DataGrid?
Вроде бы простой вопрос, но в толстых книгах об этом - ни слова. Может скажет кто, как раскрасить строку, или ячейку в нужный цвет? Пока...

Как в DataGrid убрать строку?
Доброго времени суток, столкнулся с проблемой, когда загружаю данные в DataGrid то появляется лишняя пустая строка перед данными. Вот код ...

Как сократить строку ссылку?
Не нашёл в интернете способа лучше, попробовал через стили запилить, но результат не оправдал так как колонка в которой находится строка...

Как программно выделить строку в DataGrid?
Привет! Подобный вопрос уже задавал, но никто не ответил. Как же всё-таки программно выделить строку в DataGrid? Код у меня такой,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru