powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / WinForms: ListBox DataSource
6 сообщений из 6, страница 1 из 1
WinForms: ListBox DataSource
    #32694489
Фотография nex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чего то я не могу врубится...

WinForms приложение. Есть ListBox lboxBvd.
В дизайнере (VS2003.NET) я поставил в
DisplayMember - supplier_desc, а в
ValueMember - pk_supplier.

К листбоксу прикручиваю DataSource:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
string sqlQuery = "select pk_supplier, supplier_desc from supplier_dim" +
                                    " where source_system = 'BVD' order by supplier_desc";

 // тут возвращается DadaSet с одним DataTable "bvd".  
 //Этот метод работает, я в нём уверен на 100% 
DataSet ds = _db.ExecuteSelectQuery(sqlQuery, "bvd"); 

lboxBvd.DataSource = ds.Tables["bvd"];  // пробовал ds.Table["bvd"].DefaultVew .. не помогает. 

ds.Dispose();
ds = null;

Вот. Под MSSQL 2000 всё работает ок, а когда работаю с Oracle, в листбоксе вместо названий поставщиков появляется куча "System.Data.DataRowView"...

пробовал ещё вот так:

Код: plaintext
1.
lboxBvd.ValueMember = "pk_supplier";
lboxBvd.DisplayMember = "supplier_desc";

Sql server это тоже проглатывает, а Oracle не помогает. Для соединения с Oracle использую .NET Provider "MSDAORA.1". Где тут грабли? Почему под sql server всё пашет?
...
Рейтинг: 0 / 0
WinForms: ListBox DataSource
    #32694658
Фотография nex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разрулил... напишу потом как, сейчас времени нет :)
Или у меня глюки, или у маздайского .NET провайдера для Oracle кривой DataAdapter.
...
Рейтинг: 0 / 0
WinForms: ListBox DataSource
    #32701218
Фотография nex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обещал написать, так что если кому интересно, вот чего я сделал.

1) Использовал OleDbDataReader вместо OleDbDataAdapter и вернул результат запроса как ArrayList, а не DataSet.
2) Создал struct который отображал ListBox.ValueMember и ListBox.DisplayMember.
3) Создал массив этих структур и заполнил их данными
4) Прикрутил этот массив к моему листбоксу как DataSource.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public struct BvdItem
{
	private string _pk;
	private string _name;
	
	public BvdItem(string pk, string name)
	{
		this._pk = pk;
		this._name = name;
	}
	
	public string Pk { get {return _pk;}}
	public string Name { get {return _name;}}
}

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
string sqlQuery = "select pk_supplier, supplier_desc from supplier_dim where source_system = 'BVD' order by supplier_desc";
ArrayList rs = _db.ExecuteSelectQuery(sqlQuery);

BvdItem[] items = new BvdItem[rs.Count];
int index = 0;
foreach (object[] col in rs) {
	items[index] = new BvdItem(col[0].ToString(), col[1].ToString());
	index++;
}
			
rs = null;
         
lboxBvd.DataSource = items;
lboxBvd.DisplayMember = "Name";
lboxBvd.ValueMember = "Pk";
	      
items = null;

Всё работает. Я так и не понял, где грабли были. Самое интересное, что код в первом посте работает прекрасно с sql2000, а
с Oracle вот такие траблы были... Может быть действительно в OleDbDataAdabter бага какая сидит...? Или я туплю?
...
Рейтинг: 0 / 0
WinForms: ListBox DataSource
    #32701235
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попытался воспроизвести твою ситуацию
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
DataTable	tbl=new DataTable("tbl");
tbl.Columns.Add("F1", typeof(int));  // в ListBox указан f1 (а не F1 - разница только в регистре) 
DataRow row;
for(int i=0; i<32; i++)
{ row=tbl.NewRow();
  row["f1"]="Text : "+i.ToString();
  tbl.Rows.Add(row);
}
this.listBox1.DataSource=tbl;
и получил список System.Data.DataRowView.
если указать DisplayMember="F1" (т.е. в верхнем регистре )- всё ОК

---
если мне не изменяет память, Oracle названия таблиц/полей по умолчанию возвращает в ВЕРХНЕМ (UPPER) регистре. - а это существенно для ListBox

как выход - переустанавливать названия динамически, например для DisplayMember

Код: plaintext
this.listBox1.DisplayMember=tbl.Columns[this.listBox1.DisplayMember].ColumnName;
tbl.Columns[...] - к регистру НЕЧУВСТВИТЕЛЕН
...
Рейтинг: 0 / 0
WinForms: ListBox DataSource
    #32701245
Фотография nex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот блин, надо же! Я когда с этой штукой боролся, часа четыре убил, и мне в голову не пришло, что это case sensitivity :).
Спасибо, буду знать!
...
Рейтинг: 0 / 0
WinForms: ListBox DataSource
    #32701246
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и еще одна feature (уже котрый раз, блин)
иенять нужно так:
Код: plaintext
1.
2.
string colName=tbl.Columns[this.listBox1.DisplayMember].ColumnName;
this.listBox1.DisplayMember="";       // обязательно через "нейтральное/промежуточное", иначе не изменит  
this.listBox1.DisplayMember=colName; // <- и только теперь воспринимается новое значение - feature :)
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / WinForms: ListBox DataSource
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]