2009-01-26 27 views
34

Visual Studio抱怨:警告1设计人员必须创建一个类型为'RentalEase.CustomBindingNavForm'的实例,但它不能因为该类型被声明为抽象。设计人员必须创建......的一个实例,因为该类型被声明为抽象

Visual Studio不会让我访问窗体的Designer。该类已经实现了CustomBindingNavForm中的所有抽象方法。 CustomBindingNavForm提供了一些具体和抽象的函数。

有没有办法解决这个问题?

这里是类:

public abstract class CustomBindingNavForm : SingleInstanceForm {  

     //Flags for managing BindingSource 
     protected bool isNew = false; 
     protected bool isUpdating = false; 

     /// <summary> 
     /// This is so that when a new item is added, it sets isNew and firstPass to true. The Position Changed Event will look for 
     /// firstPass and if it is true set it to false. Then on the next pass, it will see it's false and set isNew to false. 
     /// This is needed because the Position Changed Event will fire when a new item is added. 
     /// </summary> 
     protected bool firstPass = false; 


     protected abstract bool validateInput(); 
     protected abstract void saveToDatabase(); 


     //manipulating binding 
     protected abstract void bindingSourceCancelResetCurrent(); 
     protected abstract void bindingSourceRemoveCurrent(); 
     protected abstract void bindingSourceMoveFirst(); 
     protected abstract void bindingSourceMoveNext(); 
     protected abstract void bindingSourceMoveLast(); 
     protected abstract void bindingSourceMovePrevious(); 
     protected abstract void bindingSourceAddNew(); 

     public void bindingNavigatorMovePreviousItem_Click(object sender, EventArgs e) { 
      if (validateInput()) { 
       bindingSourceMovePrevious(); 
      } else { 
       DialogResult cont = MessageBox.Show(null, "There are errors in your data. Click Cancel to go back and fix them, or ok to continue. If you continue, changes will not be saved.", "Continue?", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); 
       if (cont == DialogResult.OK) { 
        if (isNew) { 
         bindingSourceRemoveCurrent(); 
         isNew = false; 
        } else { 
         bindingSourceCancelResetCurrent(); 
         bindingSourceMovePrevious(); 
        } 
       } 
      } 
     } 

     public void bindingNavigatorAddNewItem_Click(object sender, EventArgs e) { 
      if (validateInput()) { 
       saveToDatabase(); 
       bool temp = isUpdating; 
       isUpdating = true; 
       bindingSourceAddNew(); 
       isUpdating = temp; 

       isNew = true; 
       firstPass = true; 
      } else { 
       DialogResult cont = MessageBox.Show(null, "There are errors in your data. Click Cancel to go back and fix them, or ok to continue. If you continue, changes will not be saved.", "Continue?", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); 
       if (cont == DialogResult.OK) { 

        if (isNew) { 
         bindingSourceRemoveCurrent(); 
         isNew = false; 
        } else { 
         bindingSourceCancelResetCurrent(); 
        } 

        bool temp = isUpdating; 
        isUpdating = true; 
        bindingSourceAddNew(); 
        isUpdating = temp; 

        isNew = true; 
        firstPass = true; 
       } 
      } 
     } 

     public void bindingNavigatorMoveFirstItem_Click(object sender, EventArgs e) { 
      if (validateInput()) { 
       bindingSourceMoveFirst(); 
      } else { 
       DialogResult cont = MessageBox.Show(null, "There are errors in your data. Click Cancel to go back and fix them, or ok to continue. If you continue, changes will not be saved.", "Continue?", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); 
       if (cont == DialogResult.OK) { 
        if (isNew) { 
         bindingSourceRemoveCurrent(); 
         isNew = false; 
        } else { 
         bindingSourceCancelResetCurrent(); 
        } 
        bindingSourceMoveFirst(); 
       } 
      } 
     } 

     public void bindingNavigatorMoveNextItem_Click(object sender, EventArgs e) { 
      if (validateInput()) { 
       bindingSourceMoveNext(); 
      } else { 
       DialogResult cont = MessageBox.Show(null, "There are errors in your data. Click Cancel to go back and fix them, or ok to continue. If you continue, changes will not be saved.", "Continue?", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); 
       if (cont == DialogResult.OK) { 
        if (isNew) { 
         bindingSourceRemoveCurrent(); 
         isNew = false; 
        } else { 
         bindingSourceCancelResetCurrent(); 
        } 
        bindingSourceMoveNext(); 
       } 
      } 
     } 
    } 
+0

的[我怎样才能获得Visual Studio 2008的Windows窗体设计来呈现,实现一个抽象基类的表单?(可能重复http://stackoverflow.com/questions/1620847/how-can -i-得到视觉工作室-2008-Windows的表单设计器渲染的-A型 - 即-IM) – 2015-09-02 08:44:42

回答

25

我还没有看到在城市的马铃薯(其下),但我和Smelch内容与解决方案上来。 Form本身继承自一个抽象类,所以他们不告诉你的是它的它的唯一的第一级继承,不能抽象,第二个下来可以。

从那里它简单地在中间有一个空的类,围绕形式声明包装#if debug,你很好去。只要确保在发布模式和调试模式下进行设计(这是非常典型的)。

您将在设计(调试)和构建(发布)时间获得完整的设计器支持和真正的抽象基类,因为每次它最终都会使用抽象基类。

The full explanation and answer is here

相关问题