2012-04-11 1 views
1

내가하려는 것은 Ext.Net.Panel에 내 컨트롤을 추가하는 데 필요한 캐스트입니다.일부 유형이 할당 된 변수로 캐스팅

이 내 코드의 예는 다음과 같습니다

Ext.Net.Panel panel = new Ext.Net.Panel(); 
    Control control = (Control) null;//here can be any Ext.Net type as well as NumeticField for example Ext.Net.TextArea and so on 
    switch (infoAttribute.Type) 
           { 
             case PropertyTypeAttrib.Text: 
              control = (Control)new Ext.Net.TextField(); 
              ((TextField)control).FieldLabel = infoAttribute.HeadLine; 
              control.ID = propertyHelper.Name; 
              //panel.Items.Add((TextField)control); 
             typeToCast = typeof (TextField); 
             break; 
            case PropertyTypeAttrib.FileUrl: 
             control = (Control) new Ext.Net.HyperLink(); 
             control.ID = propertyHelper.Name; 
             ((Ext.Net.Label) control).FieldLabel = infoAttribute.HeadLine; 

             //panel.Items.Add((Ext.Net.HyperLink) control); 
             typeToCast = typeof (Ext.Net.HyperLink); 
             break; 
            case PropertyTypeAttrib.Enum: 
             control = (Control) new MMPControls.Web.ComboBoxEnumExt(); 
             ((MMPControls.Web.ComboBoxEnumExt) control).EnumerationTypeName = 
              propertyHelper.PropertyType.Name; 
             control.ID = propertyHelper.Name; 
             ((MMPControls.Web.ComboBoxEnumExt) control).FieldLabel = infoAttribute.HeadLine; 
             //panel.Items.Add((MMPControls.Web.ComboBoxEnumExt) control); 
             typeToCast = typeof (MMPControls.Web.ComboBoxEnumExt); 
             break; 
            case PropertyTypeAttrib.Date: 
             control = new MMPControls.Web.DateSelect(); 
             control.ID = propertyHelper.Name; 
             //panel.Items.Add(
              //(MMPControls.Web.DateSelect) control); 
             //panel.Items.Add((MMPControls.Web.DateSelect)control); 
             typeToCast = typeof (MMPControls.Web.DateSelect); 
             break; 
            case PropertyTypeAttrib.DateTime: 
             control = new MMPControls.Web.DateSelect(); 
             control.ID = propertyHelper.Name; 
             //panel.Items.Add(
              //(MMPControls.Web.DateSelect)control); 
             typeToCast = typeof (MMPControls.Web.DateSelect); 
             break; 
            case PropertyTypeAttrib.TextInteger: 
             control = (Control)new Ext.Net.NumberField(); 
             ((NumberField)control).AllowDecimals = false; 
             ((NumberField)control).MinValue = 0; 
             ((Ext.Net.NumberField)control).FieldLabel = infoAttribute.HeadLine; 
             control.ID = propertyHelper.Name; 
             //panel.Items.Add(
              //(Ext.Net.NumberField) control); 
             typeToCast = typeof (Ext.Net.NumberField); 
             break; 
            case PropertyTypeAttrib.IList: 
             //TODO: 
             break; 
            case PropertyTypeAttrib.ImageUrl: 
             control = (Control)new Ext.Net.Image(); 
             control.ID = propertyHelper.Name; 
             ((Ext.Net.Image)control).FieldLabel = infoAttribute.HeadLine; 
             //panel.Items.Add((Ext.Net.Image) control); 
             typeToCast = typeof (Ext.Net.Image); 
             break; 
            case PropertyTypeAttrib.TextFractional: 
             control = (Control)new Ext.Net.NumberField(); 
             ((NumberField)control).AllowDecimals = true; 
             ((NumberField)control).DecimalPrecision = infoAttribute.Fractional; 
             ((NumberField)control).MinValue = 0; 
             ((Ext.Net.NumberField)control).FieldLabel = infoAttribute.HeadLine; 
             control.ID = propertyHelper.Name; 
             //panel.Items.Add(
              //(Ext.Net.NumberField) control); 
             typeToCast = typeof (Ext.Net.NumberField); 
             break; 
            case PropertyTypeAttrib.TextLarge: 
             control = (Control)new Ext.Net.TextArea(); 
             ((TextArea)control).FieldLabel = infoAttribute.HeadLine; 
             control.ID = propertyHelper.Name; 
             //panel.Items.Add((TextArea)control); 
             typeToCast = typeof (TextArea); 
             break; 
    } 
    panel.Items.Add((typeToCast)control);//that's what i need to do. 

라인 panel.Items.....에서 오류가

사람이 전에 비슷한 일을했다 typeToCast이 기호를 해결할 수있어? 해결 된 사전 :

에 대한

감사 : 내가 Component 유형 내 준비 제어를 주조했다 않았다 무엇

. panel.Items.Add((Component)control);

답변

1

약간의 리팩토링으로 많은 캐스팅을 사용하지 않고도 동일한 결과를 얻을 수 있어야합니다. 다음 샘플은 매우 단순화 된 접근법을 보여줍니다. '그래서 당신이 제시 한 코드는 무엇을 실제로 대표되지 않습니다 :

<%@ Page Language="C#" %> 

<%@ Import Namespace="Panel=Ext.Net.Panel" %> 
<%@ Import Namespace="Button=Ext.Net.Button" %> 

<%@ Register assembly="Ext.Net" namespace="Ext.Net" tagprefix="ext" %> 

<script runat="server"> 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!X.IsAjaxRequest) 
     { 
      this.Form.Controls.Add(this.BuildForm()); 
     } 
    } 

    private Component BuildForm() 
    { 
     var panel = new FormPanel { 
      Title = "Example", 
      Width = 350, 
      Height = 215, 
      Padding = 5, 
      DefaultAnchor = "100%", 
      Buttons = { new Button { Text = "Submit" }} 
     }; 

     panel.Items.Add(this.BuildWidget(new Widget { 
      Name = "text", 
      ID = "TextField1", 
      Label = "My TextField" 
     })); 

     panel.Items.Add(this.BuildWidget(new Widget { 
      Name = "date", 
      ID = "DateField1", 
      Label = "My DateField" 
     })); 

     return panel; 
    } 

    private Field BuildWidget(Widget widget) 
    { 
     Field field = null; 

     switch(widget.Name) 
     { 
      case "text": 
       field = new TextField(); 
       break; 
      case "date": 
       field = new DateField(); 
       break; 
     } 

     field.ID = widget.ID; 
     field.FieldLabel = widget.Label; 

     return field; 
    } 

    public class Widget 
    { 
     public string Name { get; set; } 

     public string ID { get; set; } 
     public string Label { get; set; } 
    } 
</script> 

<!DOCTYPE html> 

<html> 
<head runat="server"> 
    <title>Ext.NET Example</title> 
</head> 
<body> 
    <form runat="server"> 
     <ext:ResourceManager runat="server" /> 

    </form> 
</body> 
</html> 
3

캐스팅 표현식의 유형 부분이 표현식의 값이 아닌 유형 (또는 유형 매개 변수)의 이름이어야하기 때문에 오류가 발생했습니다.

왜 당신은 캐스팅해야합니까? 왜 안되 :

panel.Items.Add(new Ext.Net.NumericField()); 

Control으로 캐스트가 있습니까? NumericField은 아직 Control에서 파생되지 않았습니까? typeof을 왜 사용하고 있습니까? 기본적으로 당신이 제시 한 코드에서 어떤 캐스트에 대한 필요성을 볼 수 없습니다. 그들에게 좋은 이유가 있다고 생각되면, 질문에 더 많은 문맥을 추가하십시오.

+0

은 동적으로 내 양식을하고 난 harry180 @이 – harry180

+1

될 것입니다 어떤 종류의 알 수 없기 때문에 뭐 할거야? 좀 더 적합한 예로 바꾸는 것이 좋습니다. 나는 당신이'Control'에 던져 넣어야 할 필요가 있음을 알 수 있습니다. 그러나 그게 모두가되어야합니다 ... –

+0

지금 제가하는 예제는 제가하려고하는 것을 보여 주었다고 생각합니다 :) – harry180