2011-04-22 7 views
3

객체 목록에 바인딩 C#으로하는 ASP.NET 리피터 동적으로 만들기 내가 동적으로 리피터를 만들고 동적으로 내 객체 목록에 바인딩하려고하는 사용자 정의 컨트롤에서 작업하고 있습니다. 여기 내 코드는 다음과 같습니다.내가 아주 간단한 객체를 가지고

private Repeater docList; 
docList = new Repeater(); 
docList.DataSource = documentTypes; 
docList.DataBind(); 

foreach (RepeaterItem repeatItem in docList.Items) 
{ 
    // if condition to add HeaderTemplate Dynamically only Once 
    if (repeatItem.ItemIndex == 0) 
    { 
     RepeaterItem headerItem = new RepeaterItem(repeatItem.ItemIndex, ListItemType.Header); 
     HtmlGenericControl hTag = new HtmlGenericControl("h4"); 
     hTag.InnerHtml = "Header"; 
     repeatItem.Controls.Add(hTag); 
    } 

    // Add ItemTemplate DataItems Dynamically 

    RepeaterItem repeaterItem = new RepeaterItem(repeatItem.ItemIndex, ListItemType.Item); 
    Label lbl = new Label(); 

    // This part is completely broken! 
    lbl.Text = string.Format("Content: {0} {1} <br />", (DocumentType)repeaterItem.DataItem).ID, repeaterItem.NamingContainer); 
    repeatItem.Controls.Add(lbl); 

    // Add SeparatorTemplate Dynamically 
    repeaterItem = new RepeaterItem(repeatItem.ItemIndex, ListItemType.Separator); 
    LiteralControl ltrlHR = new LiteralControl(); 
    ltrlHR.Text = "<hr />"; 
    repeatItem.Controls.Add(ltrlHR); 
} 

헤더와 구분 기호가 훌륭합니다. 항목 템플릿을 현재 항목에 바인딩하여 표시되도록하는 방법을 알 수 없습니다. 나는 내가 지금 거기에서 무엇을 가지고 있는지를 완전히 깨뜨렸다. 그러나 나는 행운이없는 여러 변형을 시도했다.

올바른 도움말을 미리 알려 주셔서 감사합니다.

답변

3

문제는 RepeaterItem에 데이터가 있다고 가정하는 것입니다. 그렇지 않습니다. 개별 항목을 표시하는 방법에 대한 정보가 들어 있습니다. 이 인덱스를 사용하여 데이터 소스로 되돌아 가야합니다. 더 좋은 방법이 있는지는 잘 모르겠지만, 아래에 어떻게 작동시켜야하는지 ...

List<DocumentType> documentTypes = new List<DocumentType>(); 
documentTypes.Add(new DocumentType(){ ID=1, Name="Bob"}); 
documentTypes.Add(new DocumentType() { ID = 2, Name = "Tom" }); 
documentTypes.Add(new DocumentType() { ID = 3, Name = "Chick" }); 
Repeater docList = new Repeater(); 
docList.DataSource = documentTypes; 
docList.DataBind(); 

foreach (RepeaterItem repeatItem in docList.Items) 
{ 
    int index = repeatItem.ItemIndex; 
    DocumentType docType = ((IList<DocumentType>)docList.DataSource)[index]; 
    // if condition to add HeaderTemplate Dynamically only Once 
    if (index == 0) 
    { 
     HtmlGenericControl hTag = new HtmlGenericControl("h4"); 
     hTag.InnerHtml = "Header"; 
     repeatItem.Controls.Add(hTag); 
    } 

    // Add ItemTemplate DataItems Dynamically 

    RepeaterItem repeaterItem = new RepeaterItem(repeatItem.ItemIndex, ListItemType.Item); 
    Label lbl = new Label(); 

    // This part is completely broken! 
    lbl.Text = string.Format("Content: {0} {1} <br />", docType.ID, repeaterItem.NamingContainer); 
    repeatItem.Controls.Add(lbl); 

    // Add SeparatorTemplate Dynamically 
    LiteralControl ltrlHR = new LiteralControl(); 
    ltrlHR.Text = "<hr />"; 
    repeatItem.Controls.Add(ltrlHR); 
} 

StringBuilder sb = new StringBuilder(); 
docList.RenderControl(new HtmlTextWriter(new StringWriter(sb))); 
Text = sb.ToString(); 
+0

존 감사합니다. 코드가 완벽하게 작동했습니다. 내가 보았던 모든 샘플 코드에서 그 스 니펫을 찾을 수 없었습니다. 나는 어딘가에서 간단한 임무 였다고 느꼈다. 다시 한 번 감사드립니다! – Dexter

관련 문제