[C#] Laden eines XML-Files in eine ListView

Major18

Mitglied
Hi@all:

Eine kleine Frage:

Und zwar hab ich ein XML-File in dem Newseinträge gespeichert werden.

Jetzt will ich diese in eine ListView laden.

Gut, das auslesen der Werte funktioniert prima, nur wie krieg ich die Daten jetzt in ein DataSet rein?

Das DataSet übergeb ich dann der ListView als Datasource.


Hoffe Ihr könnt mir helfen.

Lg
Major 18
 
Ok, die Frage hat sich erledigt, ich lade die Datensätze in eine Liste.

Das funktioniert wunderbar, aber jetzt hab ich das Problem dass die ListView nicht ins ItemDataBound-Event springt. Und somit kann ich auch die Daten aus der List ned laden.

Hier die Syntax der Listview:

HTML:
<asp:ListView ID="lstvwNews" EnalbleViestate="true" runat="server" Visible="true">
<LayoutTemplate>
    
</LayoutTemplate>
<ItemTemplate>
    <div style="border:solid 1px black;">
        <table id="Table1" cellspacing="0" border="1" cellpadding="0" runat="server" width="400px" runat="server">
        <tr>
            <td><label id="lblId"><%# Eval("ID") %></label></td>
            <td><b><label id="lblTitle" ><%# Eval("Title") %></label></b></td>
            <td><label id="lblDate"><%# Eval("Date") %></label></td>
        </tr>
        <tr>
            <td colspan="3"><label id="lblText"><%# Eval("DetailedNews")%></label></td>
        </tr>
    </table>
    </div>
    <asp:DataPager ID="DataPager1" runat="server">
        <Fields>
          <asp:NumericPagerField />
        </Fields>
   </asp:DataPager>
</ItemTemplate>

</asp:ListView>

Und hier das Codebehind:

Code:
public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            this.lstvwNews.ItemDataBound += new EventHandler<ListViewItemEventArgs>(lstvwNews_ItemDataBound);
            if (!Page.IsPostBack)
            {
                Bind();
            }
        }

        private void Bind()
        {
            this.lstvwNews.DataSource = classes.XMLManager.LoadNews();
            
        }

        protected void lstvwNews_ItemDataBound(object sender, ListViewItemEventArgs e)
        {
            
        }


         
    }

Hier werden die vorhandenen Datensätze aus dem XML-file in ein neues News-Object geladen, welches zu einer List<> hinzugefügt wird:

Code:
public static List<News> LoadNews()
        {
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.IgnoreComments = true;
            settings.IgnoreWhitespace = true;
            DataSet ds = new DataSet("News");
            List<News> lst = new List<News>();
            XmlReader reader = XmlReader.Create(@"E:\ASP.NET\markus.RTA.Solution\RTA_Relaunch\library\xml\News.xml", settings);

            while (reader.Read())
            {
                News n = new News();
                reader.ReadStartElement("News");
                reader.ReadStartElement("ID");
                n.NewsId= Convert.ToInt32(reader.ReadString());
                reader.ReadEndElement();
                reader.ReadStartElement("Title");
                n.NewsTitle = reader.ReadString();
                reader.ReadEndElement(); 
                reader.ReadStartElement("Date");
                n.NewsDate = Convert.ToDateTime(reader.ReadString());
                reader.ReadEndElement(); 
                reader.ReadStartElement("DetailedNews");
                n.NewsDetail = reader.ReadString();
                reader.ReadEndElement();

                lst.Add(n);
                
            }

            return lst;
        }

Irgendwie hab ich da keinen Durchblick mehr,....ich hoffe Ihr könnt mir da nen Ansatz geben.

Lg
Major18
 
Hi.

Code:
private void Bind()
{
    this.lstvwNews.DataSource = classes.XMLManager.LoadNews();
    this.lstvwNews.DataBind();
}

Beim DataBinding in ASP.net soltest du die DataBind-Methode aufrufen. ;)

lg,..
 
Hallo Alexander,

danke für deine schnelle antwort.

Nun ich habs mit der Databind-Methode probiert, jedoch ist die Seite leer, obwohl 1 News-Object in der Liste ist.

Und obwohl ich bei der ListView auch ein Event für OnItemDataBound="lstvwNews_ItemDataBound" , angegeben habe, wird das Event nicht aufgerufen, sollte aber wenn ich die Daten ans Grid binde.

Was mache ich falsch bzw. wo liegt mein Denkfehler?
 
Mhm..

also das Event brauchst ansich nicht. Nur, wenn du während dem Binding irgendetwas machen willst. Ansonsten sollte die Zuweisung der "DataSource" und das aufrufen von "DataBind" ausreichen.

Sicher das Daten vorhanden sind?

Debug doch mal die Seite. Mach mal einen Breakpoint auf die DataBind Methode, und schau dir an, was als DataSource vorhanden ist. Vielleicht ist da ja ein Fehler.
 
Ich hab das mal durchdebuggt, und vorher der ListView die Liste als DataSource zugewiesen.
Jetzt krieg ich beim DataBind folgende fehlermeldung:

Code:
Server Error in '/' Application.
An item placeholder must be specified on ListView 'lstvwNews'. Specify an item placeholder by setting a control's ID property to "itemPlaceholder". The item placeholder control must also specify runat="server".
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidOperationException: An item placeholder must be specified on ListView 'lstvwNews'. Specify an item placeholder by setting a control's ID property to "itemPlaceholder". The item placeholder control must also specify runat="server".

Source Error:

Line 31:             nList = classes.XMLManager.LoadNews();
Line 32:             this.lstvwNews.DataSource = nList;
Line 33:             this.lstvwNews.DataBind();
Line 34: 
Line 35: 


Source File: E:\ASP.NET\markus.RTA.Solution\RTA_Relaunch\Default.aspx.cs    Line: 33

Welchem Item/Controll muss ich da diese ItemPlaceholderid geben?
 
Hi@all:

Also das Laden der Liste in die ListView klappt tadellos.

Nun habe ich mehrer Einträge ins XML geschrieben, aber ich kriege folgende XMLException:
'Element' is an invalid XmlNodeType. Line 9, position 4.

Das XML-file ist folgendermassen aufgebaut:

HTML:
<News>
  <Message>
    <ID>1</ID>
    <Title>Test</Title>
    <Date>06.01.2009</Date>
    <DetailedNews>This is a Testmessage</DetailedNews>
  </Message>
  <Message>
    <ID>2</ID>
    <Title>Test</Title>
    <Date>08.01.2009</Date>
    <DetailedNews>This is a Testmessage</DetailedNews>
  </Message>
</News>

Ich springe nun im Code von Node zu Node, sprich ich lasse zuerst das News-Node auslesen, dann das Message-Node,etc.. ich schließe die reader auch alle wieder mit ReadEndElement, aber irgendwie schmeckt ihm der 2. Eintrag nicht.
Hier Funktion zum auslesen:

Code:
public static List<News> LoadNews()
        {
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.IgnoreComments = true;
            settings.IgnoreWhitespace = true;
            DataSet ds = new DataSet("News");
            List<News> lst = new List<News>();
            XmlReader reader = XmlReader.Create(@"E:\ASP.NET\markus.RTA.Solution\RTA_Relaunch\library\xml\News.xml", settings);

            while (reader.Read())
            {
                News n = new News();

                reader.ReadStartElement("News");
                reader.ReadStartElement("Message");
                reader.ReadStartElement("ID");
                n.NewsId= Convert.ToInt32(reader.ReadString());
                reader.ReadEndElement();
                reader.ReadStartElement("Title");
                n.NewsTitle = reader.ReadString();
                reader.ReadEndElement(); 
                reader.ReadStartElement("Date");
                n.NewsDate = Convert.ToDateTime(reader.ReadString());
                reader.ReadEndElement(); 
                reader.ReadStartElement("DetailedNews");
                n.NewsDetail = reader.ReadString();
                reader.ReadEndElement();
                reader.ReadEndElement();
                reader.ReadEndElement();

                lst.Add(n);
                
            }

            return lst;
        }


Was könnte ich da falsch gemacht haben?
 
Zurück