PDA

Показать полную графическую версию : DataGrid и гиперссылка из Access


avmir
01-09-2009, 00:33
Помогите пожалуйста в таком вопросе:

На форме есть DataGrid который получает данные из DataSet-а. DataSet заполняется из БД Access. В БД есть столбцы с гиперссылками (тип данных - гиперссылка).
В DataSet гиперссылка попадает в таком виде

текст#URI#

и также отображается в DataGrid-е (не смотря на то, что соответствующие столбцы - DataGridViewLinkColumn).
Пробовал на прямую получать данные в Grid из Access - та же песня...
Как заставить Grid правильно отображать гиперссылку?

В DataSet-е нет типа данных "гиперссылка". Если в DataSet-е поменять значение (или добавить строку), соблюдая указанный синтаксис - все успешно сохраняется в БД и при ее открытии Access-ом выглядит как надо.
А вот в DataGrid отображается без "конвертации"...

Delirium
01-09-2009, 01:47
avmir, уточните, на чем вы программируете? ASP.NET или же просто Visual C#? Просто варианты ответа отличаются :)

avmir
01-09-2009, 12:32
Не ASP - System.Windows.Forms.DataGridView

avmir
01-09-2009, 14:04
Никто не знает, что-ли? Весь инет уже облазил :( а внятного ответа нет...
"Нам бы схемку, аль чертеж"...

Delirium
02-09-2009, 00:56
avmir, вы не забывайте, что программирует немного народу, и ответить могут далеко не все :) Я сегодня попробую воспроизвести Вашу проблему и отпишу о результатах.

Delirium
02-09-2009, 02:25
Значит так. Полазив по инету, ничего толкового тоже не нашел, поэтому предлагаю альтернативный вариант: замена данных непосредственно в ячейках после заполнения грида. Пример:

private void Form1_Load(object sender, EventArgs e)
{
this.tmpTableAdapter.Fill(this.testDataSet.tmp);

string hyperlink = "";
int index = 0;
foreach (DataGridViewRow row in dataGridView1.Rows)
{
hyperlink = row.Cells[2].FormattedValue.ToString(); //Берем нашу строку вида www.ya.ru#www.ya.ru@#
index = hyperlink.IndexOf("#"); //Ищем знак #
hyperlink = hyperlink.Substring(index + 1, hyperlink.Substring(index + 1).Length - 1); //Вычисляем подстроку.
row.Cells[2].Value = hyperlink; //Заносим в ячейку.

}

}

В таком варианте все работает. В примере код вставлен сразу после заполнения грида. Можно преобразовать его в функцию и вызывать когда необходимо. Само собой, надо будет в строке row.Cells[2].Value вместо 2 поставить нужный столбец.

avmir
02-09-2009, 04:23
Спасибо! Попробую сей вариант. Только не знаю как это отразится на производительности если ячеек, например, 40000...

Delirium
02-09-2009, 05:35
avmir, а что, вы будете отображать на экране сразу все 40 000 строк? По этому поводу уже много дебатов было. Как правило, делают либо пейджинг, либо еще как.
P.S. 98 000 тестовых записей обрабатывались около 2,5 секунд в DEBUG режиме.

P.P.S. А может быть проще в БД хранить ссылки в виде текста, а уже в DataGridView делать DataGridViewLinkColumn на данное поле? Так гораздо быстрее и проще.




© OSzone.net 2001-2012