2011-01-11 1 views
0

Я пытаюсь создать динамические элементы Li на основе значений базы данных с выходом выглядящих как:построить динамичную Ли с DataBind

<li id="myUniqueLiID" runat="server"><a href="vaiable url from db">variable string from db</a></li> 

Количества Li элементов будет определяться во время выполнения. Я хочу пойти с элементами li, потому что, по-моему, это оставляет мне больше возможностей для манипуляции в более поздние времена, поскольку я против нескольких элементов asp, с которыми я работал, например asp: ListBox.

Вот код, я работаю с до сих пор

SqlDatabase myconnection= new SqlDatabase(@"myconnection string"); 
DbCommand myproc= myconnection.GetStoredProcCommand("sp_MySP"); 

using (IDataReader LoadAllItems = myconnection.ExecuteReader(myproc)) 
{ 
    while (LoadAllItems.Read()) 
    { 
     // retrieves ID from db 
     int myID = LoadAllItems.GetInt32(0); 
     // retrieves string from db 
     string myName = LoadAllItems.GetString(1); 
     // I have a static method that builds url based off id 
     // it takes an int and returns a string 
     string restURL = MyLibrary.MyClass.StaticURLMethod(myID); 

     //data bind to li element 
     myLiID.datasource = LoadAllItems; 
     //I think I build the li in datatextfield area but not 
     //sure if that is correct, or how to format. 
     myLiID.datatextfield = ""; 
     myLiID.databind(); 
    } 
} 

Если я нахожусь на правильном пути, пожалуйста, немного указания о том, куда идти дальше. Если я уйду в неправильном направлении, пожалуйста, определите правильное направление.

ответ

3

Вот немного руководства:

  • Я бы отделить от загрузки данных из базы данных и привязки его к элементу управления графического интерфейса. Например, сначала загрузите его в коллекцию, а затем привяжите эту коллекцию к элементу управления.
  • «Количество элементов li будет определено во время выполнения» - похоже, вы можете использовать Repeater для привязки данных. Убедитесь, что вы создали элемент li в ретрансляторе.

Допустим, вы создаете метод GetData который возвращает Dictionary<int, string>, вы могли бы связать эти данные с Repeater.

The Repeater:

<asp:Repeater ID="rep" runat="server"> 
    <ItemTemplate> 
     <li><a runat="server" id="myLink" /></li> 
    </ItemTemplate> 
</asp:Repeater> 

привязки данных к Repeater с чем-то вроде этого:

private void BindData(Dictionary<int, string> dict){ 
     this.rep.ItemDataBound += new RepeaterItemEventHandler(rep_ItemDataBound); 
     this.rep.DataSource = dict; 
     this.rep.DataBind(); 
    } 

    void rep_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
      KeyValuePair<int, string> kp = e.Item.DataItem as KeyValuePair<int, string>; 
      //... find the control and update it with the correct values 
     } 
    } 

Я оставлю его вам на самом деле найти управление и обновить его с правильным текст и URL.

Надеюсь, это поможет в некотором роде.

+0

ретрансляторов идеально подходит для такого рода вещи. – NotMe

+1

спасибо за ответ. Он отлично работал. Я собираюсь опубликовать свой ответ о том, как найти элемент управления и обновить его, но я буду отмечать ваш ответ, поскольку вы предоставили мне большую часть информации. –

+0

Thx! Вы попросили небольшое руководство, поэтому я думал, что вы не хотите, чтобы все было прописано. Не был уверен, что уйти ... Подробнее о FindControl on SO: http://stackoverflow.com/questions/1203316/cant-find-control-within-asp-net-repeater – marapet

0

Вот точный код, который я использовал после принятия рекомендаций от marapet:

<div class="filterlist"> 
    <ul id="list"> 
     <asp:Repeater ID="MyList" runat="server"> 
       <ItemTemplate> 
        <li runat="server"> 
        <asp:HyperLink ID="MyLink" runat="server" Text="" NavigateUrl=""/> 
        </li> 
       </ItemTemplate> 
     </asp:Repeater> 
    </ul> 
</div> 

Это код позади

protected void Page_Load(object sender, EventArgs e) 
{ 
//This method return a dictionary with a URL, and a name 
    if (!Page.IsPostBack) 
     this.BindDate((Dictionary<string, string>)MyLibrary.Data.DataHelper.GetMytList()); 
} 

private void BindDate(Dictionary<string, string> dict) 
{ 
    this.RestList.ItemDataBound += new RepeaterItemEventHandler(e_ItemDataBound); 
    this.RestList.DataSource = dict; 
    this.RestList.DataBind(); 
} 

void e_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem)) 
    { 
     KeyValuePair<string, string> mydict = (KeyValuePair<string, string>)e.Item.DataItem; 
     HyperLink Link = (HyperLink)e.Item.FindControl("MyLink"); 
     Link.NavigateUrl = mydict.Value.ToString(); 
     Link.Text = mydict.Key.ToString(); 
    } 
}