用户控件无法添加到winform?

时间:2014-09-09 09:39:52

标签: c# winforms user-controls

我正在开发winform应用程序。我的应用程序中有一个用户控件作为同一项目的一部分。我在该用户控件的构造函数中编写了以下代码

 public ctrlCurrentLocation()
    {            
        InitializeComponent();
        string NewLine = System.Environment.NewLine;
        string strHeader = string.Concat("<?xml version=\"1.0\"?>", NewLine, "<TrackMap>", NewLine);
        string strLast = strHeader + string.Concat("</TrackMap>", NewLine);
        strXMLPath = AppDomain.CurrentDomain.BaseDirectory + "JavaScript\\TrackMap.xml";
        FileStream fs1 = File.Open(strXMLPath, FileMode.Create);
        StreamWriter writer1 = new StreamWriter(fs1, Encoding.UTF8);
        writer1.Write(strLast);
        writer1.Close();
        fs1.Dispose();
        .......
        .
        .
    }

现在,在构建解决方案后,此用户控件将显示在工具箱中。 当我试图在我的mainForm中拖动此用户控件时,它会抛出设计时异常说

enter image description here

可能是什么原因,它会在行

处引发错误
FileStream fs1 = File.Open(strXMLPath, FileMode.Create);

1 个答案:

答案 0 :(得分:0)

在设计模式下,

AppDomain.CurrentDomain.BaseDirectory正在返回C:\Program Files...\IDE。这不是您的TrackMap.xml文件的位置。

您可以向UserControl添加属性,例如ctrlCurrentLocation.MapFilePath,可以在设计器中设置。然后使用文件的数据刷新us​​erControl。

实施例

private string _mapFilePath = null;

public ctrlCurrentLocation()
{            
    InitializeComponent();
}

private void ReloadMap()
{
    if(_mapFilePath != null && File.Exists(_mapFilePath))
    {
        string NewLine = System.Environment.NewLine;
        string strHeader = string.Concat("<?xml version=\"1.0\"?>", NewLine, "<TrackMap>", NewLine);
        string strLast = strHeader + string.Concat("</TrackMap>", NewLine);
        strXMLPath = AppDomain.CurrentDomain.BaseDirectory + "JavaScript\\TrackMap.xml";
        FileStream fs1 = File.Open(strXMLPath, FileMode.Create);
        StreamWriter writer1 = new StreamWriter(fs1, Encoding.UTF8);
        writer1.Write(strLast);
        writer1.Close();
        fs1.Dispose();
        .......
        .
        .
    }
}

public string MapFilePath
{
    get { return _mapFilePath; }
    set
    {
        _mapFilePath = value;
        ReloadMap();
    }
}

使用映射路径的代码已从构造函数移动到其自己的方法。只要MapFilePath属性发生更改,就会调用此方法。

此属性将出现在设计器的“属性”面板中,因为它是UserControl类的公共属性。在那里,您可以粘贴文件路径,并执行ReloadMap的代码。