2009-06-17 9 views
11

Peut-être que je vais à ce sujet tout faux (et s'il vous plaît dites-moi si je suis), mais je me heurte la tête contre un mur avec quelque chose qui semble être un concept très simple.HtmlTextWriter to String - Est-ce que je regarde quelque chose?

Cette substitution de rendu provient d'un contrôle utilisateur. Cela ressemble à une façon évidente de le faire, mais je n'arrive pas à le trouver.

Quelqu'un peut-il nous éclairer là-dessus, s'il vous plaît?

Répondre

20

Essayez ceci:

protected override void RenderContents(HtmlTextWriter output) 
{ 
    StringBuilder sb = new StringBuilder(); 
    HtmlTextWriter htw = new HtmlTextWriter(new System.IO.StringWriter(sb, 
    System.Globalization.CultureInfo.InvariantCulture)); 
    foreach (Control ctrl in Controls) 
    { 
     ctrl.RenderControl(htw); 
    } 
    string strContents = sb.ToString(); 

}

+0

+1 C'est une! Merci pour l'aide! –

+1

Juste pour le suivi - J'ai ouvert Reflector ouvert et a constaté que la méthode Render appelle simplement RenderChildren pour chaque contrôle dans l'arborescence sous le contrôle de l'utilisateur. Cela signifie que vous étiez sur place à ce sujet. Merci encore! –

1

Méthode alternative à l'aide relfection:

private string GetString(HtmlTextWriter writer) 
{ 
    // the flags to see the internal properties of the writer 
    System.Reflection.BindingFlags flags = System.Reflection.BindingFlags.Default; 
    flags |= System.Reflection.BindingFlags.NonPublic; 
    flags |= System.Reflection.BindingFlags.Instance; 
    flags |= System.Reflection.BindingFlags.FlattenHierarchy; 
    flags |= System.Reflection.BindingFlags.Public; 

    // get the information about the internal TextWriter object 
    System.Reflection.FieldInfo baseWriter = writer.GetType().GetField("writer", flags); 

    // use that info to create a StringWriter 
    System.IO.StringWriter reflectedWriter = (System.IO.StringWriter)baseWriter.GetValue(writer); 

    // now we get a StringBuilder! 
    StringBuilder builder = reflectedWriter.GetStringBuilder(); 

    return builder.ToString(); 
} 

Ensuite, il est une simple question de recréer l'HtmlTextWriter à l'aide du chaîne et un StringBuilder.

Cela a été construit en utilisant un couple d'indices que je pris en charge à un conversation between Tom Spink and Rotsey sur EggheadCafe

+2

Yuck! Ce n'est pas bien ... – tomfanning

+0

D'accord avec @tomfanning, je ne vois aucun intérêt à utiliser la réflexion ici. –

Questions connexes