0

我正在 Visual Studio 中制作一个简单的浏览器。
为了能够保存和删除书签,我使用了这些代码:

当打开 frmFavorites 时,它会读取一个名为 Favorites.xml 的 xml 文件

private void frmFavorites_Load(object sender, EventArgs e) {
        System.Xml.XmlDocument loadDoc = new System.Xml.XmlDocument();
        loadDoc.Load(Application.StartupPath + "\\Favorites.xml");

        foreach (System.Xml.XmlNode favNode in loadDoc.SelectNodes("/Favorites/Item")) {
            listViewFavs.Items.Add(favNode.Attributes["url"].InnerText);
        }
    }

当表单再次关闭时,它将覆盖 xml 文件并将所有剩余项目保存在 xml 文件中

private void frmFavorites_FormClosing(object sender, FormClosingEventArgs e) {
        System.Xml.XmlTextWriter writer = new System.Xml.XmlTextWriter(Application.StartupPath + "\\Favorites.xml", null);

        writer.WriteStartElement("Favorites");
        for (int i = 0 ; i < listViewFavs.Items.Count ; i++) {
            writer.WriteStartElement("Item");
            writer.WriteAttributeString("url", listViewFavs.Items[i].Text);
            writer.WriteEndElement();
        }
        writer.WriteEndElement();
        writer.Close();
    }

要添加和删除书签,我正在使用以下代码:

private void btnAddFav_Click(object sender, EventArgs e) {
        ListViewItem item = new ListViewItem(txtURL.Text);
        listViewFavs.Items.Add(txtURL.Text);
    }

    private void btnDelFav_Click(object sender, EventArgs e) {
        try {
            listViewFavs.Items.RemoveAt(listViewFavs.SelectedIndices[0]);
        }
        catch {
            MessageBox.Show("Je moet een item selecteren", "Geen item geselecteerd", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
    }

现在,我的问题是:
我想让我的用户能够双击一个项目,这样他们就可以导航到他们保存的收藏夹。至少,这是应该发生的。
到目前为止,我已经尝试了一些代码并最终得到了这个:

private void listViewFavs_DoubleClick(object sender, EventArgs e) {
        try {
            FrmMain Main = new FrmMain();
            Main.navigate(listViewFavs.SelectedItems[0].Text);
        }
        catch {
            MessageBox.Show("Je moet een item selecteren", "Geen item geselecteerd", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
    }

frmMain 是我的浏览器,并且 navigate 是我用来检查 URL 和导航的公共方法。

要导航,我使用以下代码:

public void navigate(String URL) {
        if (String.IsNullOrEmpty(URL) || URL.Equals("about:blank")) {
            GetActiveBrowser().DocumentText = Properties.Resources.FirstTime; // this is a HTML-doc you also see when you open the browser for the 1st time
            txtURL.Text = "about:blank";
            return;
        } else if (!URL.StartsWith("http://") && !URL.StartsWith("https://") && !URL.StartsWith("file://") && !URL.StartsWith("ftp://"))
            URL = "http://" + URL;
        try {
            GetActiveTab().Text = "... Loading ...";
            this.Icon = Properties.Resources.loading1;
            GetActiveBrowser().Navigate(new Uri(URL));
        }
        catch (System.UriFormatException) {
            MessageBox.Show("'" + URL + "' is geen geldige URL", "Ongeldige URL", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    } // go to URL

如您所见,我使用了 GetActiveTab() 和 GetActiveBrowser:

private WebBrowser GetActiveBrowser() {
        return (WebBrowser)tabs.SelectedTab.Controls[0];
    }

private TabPage GetActiveTab() {
        return tabs.SelectedTab;
    }

实际发生的情况:
我双击该项目
没有任何反应 -.- 没有导航,没有错误,没有任何反应

有没有人有解决这个问题的想法?
我感谢提供的任何帮助。

4

1 回答 1

1

看起来您正在从列表中删除该项目,然后尝试访问该项目。

在这里您删除该项目:

listViewFavs.Items.RemoveAt(listViewFavs.SelectedIndices[0]); 

然后在这里您尝试访问所选项目,但它不存在,您只是将其删除:

Main.navigate(listViewFavs.SelectedItems[0].Text); 

试着不要打电话RemoveAt,你不想删除它对吧?如果目标只是使用该选定项目在父表单上导航,那么将其从书签列表中删除是违反直觉的。

编辑:

要 Debug navigate,您需要单步执行该调用(在第一行设置断点)并验证是否URL正在获取值。使用 Step-Over(通常是 F10)来遍历函数并验证它采用您期望的代码路径。

此外,也许更重要的是,您似乎正在创建一个新的FrmMain但没有显示它。然后它超出范围,因为它是在该方法中定义的,然后 GC 将其扫除。

你应该在这里做两件事之一:

1)使用 的现有实例FrmMain,这可能是这种情况,因为我假设有人frmFavorites FrmMain启动然后双击以导航回已经打开的窗口。

2)或调用Main.Show()以使新表单可见,以便在定义它的方法返回后它将继续存在。

如果FrmMain当用户单击收藏夹时实例可能已经存在或不存在,您可以使用延迟加载的静态实例,您可以在需要访问主表单的任何地方引用该实例。所以在双击处理程序中:

FrmMain main = FrmMain.Instance;
main.Show();
main.navigate(listViewFavs.SelectedItems[0].Text);

然后在FrmMain

static FrmMain _instance;
public static FrmMain Instance 
{
   if (_instance==null)
       _instance = new FrmMain();

   return _instance;
}
于 2012-02-02T21:09:25.300 回答