Переход к выбранному ListViewItem при двойном щелчке - PullRequest
0 голосов
/ 03 февраля 2012

Я делаю простой браузер в Visual Studio.
Чтобы иметь возможность сохранять и удалять закладки, я использую следующие коды:

Когда откроется frmFavor, он прочитает xml-файл с именем Favorites.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 - это мой браузер, а навигация - это публичный метод, который я использую для проверки 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;
    }

Что на самом деле происходит:
Я дважды щелкаю по пункту
Ничего не происходит -.- Нет навигации, нет ошибок, нет ничего

У кого-нибудь есть идея решить эту проблему?
Я ценю любую помощь, оказанную.

1 Ответ

1 голос
/ 03 февраля 2012

Похоже, что вы удаляете элемент из списка, затем пытаетесь получить доступ к этому элементу.

Здесь вы удаляете элемент:

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

, тогда прямо здесь вы пытаетесьчтобы получить доступ к выбранным элементам, но его там нет, вы просто удалили его:

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

Попробуйте не звонить RemoveAt, вы все равно не хотите его удалить, верно?Если цель состоит в том, чтобы просто использовать этот выбранный элемент для навигации по родительской форме, то удаление его из списка закладок противоречит интуиции.

Редактировать:

Для отладки 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;
}
...