2014-01-20 97 views
0

我正在嘗試爲Spread.NET創建自定義單元格類型。我得到的錯誤是無法調用抽象基礎成員

無法調用抽象基成員: 「FarPoint.Web.Spread.BaseCellType.PaintCell(字符串, System.Web.UI.WebControls.TableCell,FarPoint.Web.Spread.Appearance , FarPoint.Web.Spread.Inset,對象,布爾)」

下面的代碼

[Serializable()] 
public class BarcodeCellType : FarPoint.Web.Spread.BaseCellType 
{ 
    public override Control PaintCell(string id, TableCell parent, Appearance style, Inset margin, object value, bool upperLevel) 
    { 
     parent.Attributes.Add("FpCellType", "BarcodeCellType"); 

     if (value != null) 
     { 
      try 
      { 
       MemoryStream ms = GenerateBarCode(value.ToString()); 
       var img = Bitmap.FromStream(ms); 
       value = img; 
      } 
      catch (Exception ex) 
      { 
       value = ex.ToString(); 
      } 
     } 

     return base.PaintCell(id, parent, style, margin, value, upperLevel); //ERROR HERE 
    } 

    private MemoryStream GenerateBarCode(string codeInfo) 
    { 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      BarCodeBuilder bb = new BarCodeBuilder(); 
      bb.CodeText = codeInfo; 
      bb.SymbologyType = Symbology.Code128; 
      bb.BarCodeImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
      return ms; 
     } 
    } 
} 
+0

基礎方法是否是虛擬的,並且與您的覆蓋具有相同的簽名? – twrowsell

+1

只是擡頭,你有內存泄漏。你的MemoryStream和位圖的實例應該通過調用Dispose()完成之後清理它們,或者在「使用」塊中包裝它們。 –

+0

嗨mjmarsh - 我更新了我的代碼。你是否在做這樣的事情? – daved

回答

1

這是因爲在您的抽象類「FarPoint.Web.Spread.BaseCellType」中,您可能將PaintCell方法定義爲抽象,而抽象方法聲明引入了新的虛擬方法,但未提供該方法的實現。相反,非抽象派生類(「BarcodeCellType」)需要通過重寫該方法來提供自己的實現。因爲抽象方法沒有提供實際的實現。

1

PaintCell聲明abstractvirtual所以你不能做base.PaintCell電話。取決於您的代碼,創建Control對象並將其返回。

如果您不想創建Control,您可能希望從派生類更多的派生類中繼承,並重寫派生類PaintCell方法。

-1

你不能調用抽象方法。它需要在派生類中定義。

1

基本成員是抽象的,這意味着沒有實現。取消撥打電話base.PaintCell將允許代碼編譯,但我不確定那會得到代碼,您必須工作

+2

它不會編譯,因爲他依靠創建將從他的覆蓋返回的'Control'的方法,我認爲他在他之前需要做很多工作才能使其工作。 –