|
|
|
Junior 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 соответственно данному городу; но сделать я не смог, может кто поможет?
спасибо
|
|
|
|
|
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 города или его названию, иначе получится каша.
Чтобы нельзя было выбрать город можно заменить тег
|
|
|
|
|
Junior 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;
|
|
|
|
|
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.
|
|
|
|
|
Junior Member
      
участник
Last Login: 15.11.2005 11:20
Сообщ.: 23,
Visits: 254
|
|
| спасибо большое все заработало, у меня еще вопросик а как можно сделать selected, ну т.е. есть какой-то streedId и нужно чтобы у данного
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| [quote="texa"]как можно сделать selected, ну т.е. есть какой-то streedId и нужно чтобы у данного
|
|
|
|
|
Junior Member
      
участник
Last Login: 15.11.2005 11:20
Сообщ.: 23,
Visits: 254
|
|
| все заработало, спасибо огромное!
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
|
|
|
| | |