DropDownList_DataBinding
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



DropDownList_DataBinding Expand / Collapse
Автор
Сообщение
04.10.2005 11:48
Junior Member

Junior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior Member

участник
Last Login: 15.11.2005 11:20
Сообщ.: 23, Visits: 254
есть 2 таблицы

city      street
-------- --------
id        id
name cityID
          name

как понимаете есть связь city.id= street.cityID
хотел в DropDownList запихать эти две таблицы, вот каким образом


задумка была такая, запихать в DropDownList значение таблицы city, а потом при DataBinding проверять, если в городе есть улицы, тогда вставлять значения из таблицы street соответственно данному городу; но сделать я не смог, может кто поможет?
спасибо
Сообщ. #881959
04.10.2005 12:50
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Пишем запром
SELECT c.Name sCityName,
c.id iCity_ID,
s.id iStreet_ID,
s.Name sStreetName
FROM city c
LEFT JOIN street s ON s.cityID = c.id
ORDER BY c.id
Затем размещаем на странице Repeater, в HeaderTemplate у него размещаем . В ItemTemplate делаем "финт ушами" :)







В коде выполняем запрос и привязываем (DataBind) его результаты к Repeater. Перед DataBind указываем также обработчик события ItemCreated.
repeaterStreets.ItemCreated += new RepeaterItemEventHandler(this.OnStreetsItemCreated);

Функция OnStreetsItemCreated делает примерно следующее
private int _cityId, _prevCityId, _streetId;
private string _cityName, _streetName;
public int CityId { get { return _cityId; } }
public int StreetId { get { return _streetId; } }
public string CityName { get { return _cityName; } }
public string StreetName { get { return _streetName; } }

private void OnStreetsItemCreated(object sender, RepeaterItemEventArgs e)
{
if (null == e.Item.DataItem) return;

// Получаем данные из базы
_cityId = ...
_streetId = ...
_cityName = ...
_streetName = ...

PlaceHolder holderCity = e.Item.FindControl("holderCity");
if (_prevCityId != _cityId)
{
holderCity.Visible = true;
}

_prevCityId = _cityId;
}

То есть идея в том что вложенный элемент выводится только если встречается город который отличается от предыдущего. Результаты запроса, соотвественно, можно сортировать только по id города или его названию, иначе получится каша.

Чтобы нельзя было выбрать город можно заменить тег
Сообщ. #881967
05.10.2005 11:55
Junior Member

Junior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior Member

участник
Last Login: 15.11.2005 11:20
Сообщ.: 23, Visits: 254
Спасибо за ответ, задумка хорошая, но мне не понятно одно, каким образом мне данные из базы привязывать к переменным _cityId, _streeId и т.д.

Я попытался сделать так:

[italic]но данные выводятся неправильно[/italic]

int i = 0;
private void OnLocationItemCreated(object sender, RepeaterItemEventArgs e)
{
if(null == e.Item.DataItem) return;

DataTable dt = ProjectDataManager.GetCityAndStree();

if(i < dt.Rows.Count)
{
DataRow dr = dt.Rows[i];

_cityId= Convert.ToInt32(dr["_cityId"]);
_cityName = dr["cityName"].ToString();

if(dr["streetId"] != DBNull.Value)
{
_streetId = Convert.ToInt32(dr["streetId"]);
_streetName = dr["streetName"].ToString();
}
// добаил это, т.к. если в городе нету улицы, то показывается пустой



Подскажи как нужно привязать правильно данные из бд к лок. переменным.
И для чего нужна вот эта строчка
if(null == e.Item.DataItem) return;
Сообщ. #882036
05.10.2005 12:17
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
[quote="texa"]мне не понятно одно, каким образом мне данные из базы привязывать к переменным _cityId, _streeId и т.д.[/quote]
DataTable dt = ProjectDataManager.GetCityAndStree();
repeaterStreets.DataSource = dt;
repeaterStreets.ItemCreated += new RepeaterItemEventHandler(this.OnStreetsItemCreated);
repeaterStreets.DataBind();

private void OnStreetsItemCreated(object sender, RepeaterItemEventArgs e)
{
if (null == e.Item.DataItem) return;

// Получаем данные из базы
DataRowView dbrow = (DataRowView)e.Item.DataItem;
_cityId = (int)dbrow["iCity_ID"];
_streetId = (int)dbrow["iStreet_ID"];
_cityName = (string)dbrow["sCityName"];
_streetName = (string)dbrow["sStreetName"];

...
}

Данный код будет работать если в качестве источника данных выступает DataTable. Для DataReader используй класс DbDataRecord (из System.Data.Common) вместо DataRowView.

[quote="texa"]И для чего нужна вот эта строчка if (null == e.Item.DataItem) return;[/quote]
DataItem указывает на текущий элемент из источника данных которые нужно отобразить. Это поле будет пустым для Header, Footer и Separator. Эти элементы мы и пропускаем - для них поле DataItem будет равно null.
Сообщ. #882042
06.10.2005 10:24
Junior Member

Junior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior Member

участник
Last Login: 15.11.2005 11:20
Сообщ.: 23, Visits: 254
спасибо большое все заработало, у меня еще вопросик а как можно сделать selected, ну т.е. есть какой-то streedId и нужно чтобы у данного
Сообщ. #882108
06.10.2005 13:12
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
[quote="texa"]как можно сделать selected, ну т.е. есть какой-то streedId и нужно чтобы у данного
Сообщ. #882129
20.10.2005 12:35
Junior Member

Junior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior Member

участник
Last Login: 15.11.2005 11:20
Сообщ.: 23, Visits: 254
все заработало, спасибо огромное!
Сообщ. #883083
20.10.2005 12:38
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Пожалуйста.
Сообщ. #883085
02.11.2005 5:33