views:

162

answers:

1

I'm writing am ASP.NET/C# project, it's a simple blog page with commnents. Problem I'm having when button click you see comments load original blogload plus blogs and comments, trying to get it to load blog/comment selected only. If I try not to load blog in page_load or have it only do if not postback nothing is displayed. Any help would be appreciated. PS I know there are many blog engines out there but have specific reason.

protected void Page_Init(object sender, EventArgs e)
{
    //ParseControls(GlobalVar.pathxsltver);
    //        BindInfo();
}
private void ParseControls(string myxslt)
{

    //load the data
    FileStream fs = new FileStream(Server.MapPath ( GlobalVar.compathver), FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    DataSet dset = new DataSet();
    dset.ReadXml(fs);
    fs.Close();
    XPathDocument xdoc = new XPathDocument(Server.MapPath(GlobalVar.pathver ));
    XmlDocument mydoc = new XmlDocument();
    XPathNavigator navigator = xdoc.CreateNavigator();
    XPathExpression expression = navigator.Compile("BlogItems/Blog");
    expression.AddSort("ID", XmlSortOrder.Descending, XmlCaseOrder.UpperFirst, string.Empty, XmlDataType.Text);
    XPathNodeIterator iterator = navigator.Select(expression);
    int TheCnt = 0;
    int cnt = GlobalVar.BlogCntDisplay;
    string st = "<BlogItems>";
    foreach (XPathNavigator item in iterator)
    {
        TheCnt++;
        string sid = item.SelectSingleNode("ID").Value;
        st = st + "<Blog id=\"" + sid + "\">" + item.InnerXml;
        st = st + "<ComCnt>" + MyFunc.CountComments (sid,dset) +  "</ComCnt></Blog>";
        if (TheCnt == cnt) { break; }
    }
    st = st + "</BlogItems>";
    mydoc.LoadXml(st);
    XslCompiledTransform transform = new XslCompiledTransform();
    XsltSettings settings = new XsltSettings(true,true);
    transform.Load(Server.MapPath(myxslt),settings,null);
    StringWriter sw = new StringWriter();
    transform.Transform(mydoc, null, sw);
    string result = sw.ToString();
    //remove namespace
    result = result.Replace("xmlns:asp=\"remove\"", "");
    //parse control
    Control ctrl = Page.ParseControl(result);
    //find control to add event handler
    //Boolean test =  phBlog.FindControl("btnComment2").i;
   phBlog.Controls.Add(ctrl);
    XmlNodeList  nList = mydoc.SelectNodes("//BlogItems/Blog/ID");
   foreach (XmlNode objNode in nList)
   { 
    Button btnComment = (Button) phBlog.FindControl("btnComment"+objNode.InnerText );
    btnComment.CommandArgument = objNode.InnerText ;
       btnComment.BorderWidth = 0 ;

    btnComment.Command += new CommandEventHandler(Button1_Click);
   }
}

protected void Page_Load(object sender, EventArgs e)
{

   //if (!Page.IsPostBack )
   //{ParseControls(GlobalVar.pathxsltver);}
    ParseControls(GlobalVar.pathxsltver);
   }

protected void Button1_Click(object sender, CommandEventArgs e)
{
    Label1.Text = "Comm hit : " + e.CommandArgument.ToString();
    ParseControls(GlobalVar.blogcommentsver ); 
}
A: 

You're question is kind of vague, but if I understand you correctly, you're wondering why the entire page refreshes when you just want to handle the button click?

Whenever you do any kind of postback, and that includes handling any events, the entire page is re-rendered. More than that, you're working with a brand new instance of your page class. The old one is dead and gone. That's just the way the web normally works.

If you only want to reload a part of the page, you need to use ajax. In ASP.Net land, that means placing your comments section inside an UpdatePanel control that can be refreshed.

Joel Coehoorn