1: namespace WebApplication1
2: {
3: [NonVisualControl]
4: public class OutputAdapterControl : Control
5: {
6: private static readonly FieldInfo occasionalFieldsField = typeof(Control).GetField("_occasionalFields", BindingFlags.NonPublic | BindingFlags.Instance);
7: private static readonly FieldInfo flagsField = typeof(Control).GetField("flags", BindingFlags.NonPublic | BindingFlags.Instance);
8:
9: public OutputAdapterControl()
10: {
11: this.Enabled = true;
12: }
13:
14: public String XslPath
15: {
16: get;
17: set;
18: }
19:
20: public String TargetControlID
21: {
22: get;
23: set;
24: }
25:
26: public Boolean Enabled
27: {
28: get;
29: set;
30: }
31:
32: public event EventHandler<OutputEventArgs> Output;
33:
34: private ControlAdapter getControlAdapter(Control control)
35: {
36: Object flags = flagsField.GetValue(control);
37: MethodInfo setMethod = flags.GetType().GetMethod("Set", BindingFlags.NonPublic | BindingFlags.Instance);
38: setMethod.Invoke(flags, new Object[] { 0x8000 });
39:
40: Object occasionalFields = occasionalFieldsField.GetValue(control);
41: FieldInfo rareFieldsField = occasionalFields.GetType().GetField("RareFields");
42: Object rareFields = rareFieldsField.GetValue(occasionalFields);
43:
44: if (rareFields == null)
45: {
46: rareFields = FormatterServices.GetUninitializedObject(rareFieldsField.FieldType);
47: rareFieldsField.SetValue(occasionalFields, rareFields);
48: }
49:
50: FieldInfo adapterField = rareFields.GetType().GetField("Adapter");
51: ControlAdapter adapter = adapterField.GetValue(rareFields) as ControlAdapter;
52:
53: return (adapter);
54: }
55:
56: private void setControlAdapter(Control control, ControlAdapter controlAdapter)
57: {
58: Object occasionalFields = occasionalFieldsField.GetValue(control);
59: FieldInfo rareFieldsField = occasionalFields.GetType().GetField("RareFields");
60: Object rareFields = rareFieldsField.GetValue(occasionalFields);
61: FieldInfo adapterField = rareFields.GetType().GetField("Adapter");
62: adapterField.SetValue(rareFields, controlAdapter);
63: }
64:
65: internal void RaiseOutputEvent(OutputEventArgs e)
66: {
67: if (this.Output != null)
68: {
69: this.Output(this, e);
70: }
71: }
72:
73: protected override void OnPreRender(EventArgs e)
74: {
75: if ((this.Enabled == true) && (String.IsNullOrWhiteSpace(this.TargetControlID) == false))
76: {
77: Control control = this.FindControl(this.TargetControlID);
78: ControlAdapter controlAdapter = this.getControlAdapter(control);
79: OutputAdapterControlAdapter newAdapter = new OutputAdapterControlAdapter(this, controlAdapter, control, this.XslPath);
80:
81: this.setControlAdapter(control, newAdapter);
82: }
83:
84: base.OnPreRender(e);
85: }
86: }
87: }