_Q12_ Ответов: 2

Как получить номер (динамической) ссылки, которая нажата ?


- У меня есть куча ссылок в файле, который я читаю и визуализирую в своем визуальном списке.
Я создал объект LinkLabel. Я также создал файл с true и false для каждой ссылки из моего файла ссылок. Так что это параллельный файл для ссылки один. Пока что я могу читать с моего "visited.txt" файл и обновить мой визуальный список отлично. Я обновляю список вручную. Но я хочу сделать его автоматическим, когда я нажимаю ссылку в своем визуальном списке, чтобы переписать список". visited.txt - файл.
- Я получаю эту проблему уже 3 дня. Ну, я должен был решить и другие неудобства тоже, но это начинает затягиваться, и я хочу, чтобы это было решено. У меня действительно нет (простой) идеи, как действовать, так как все, что я мог придумать, очень сложно. В конце концов, я сделаю это сложным способом, но я думаю, что, может быть, это маленький трюк, который я упускаю, и вы это знаете (держу пари, что это так) >:)

Что я уже пробовал:

        private void buttonImport_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < link.Length; i++)
            {
                LinkLabel linklabel = new LinkLabel();
                linklabel.Location = new Point(0, 22 * (i + 1));
                panel1.Controls.Add(linklabel);

                linklabel.LinkClicked += new LinkLabelLinkClickedEventHandler(linklabel_LinkClicked);

/* This line, it means that it will read the "visited.txt" file and update in my list whatever is saved in the file. And if i modify the content from file manually, is working fine in code and in my visual list. */
                linklabel.LinkVisited = bool.Parse(visited[i]);
            }
        }


        List<string> ListLinksVisited = new List<string>();
        void linklabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            if (e.Link.LinkData.ToString() != "")
            {
                Process.Start(e.Link.LinkData.ToString());
                e.Link.Visited = true; //show in list that link is clicked

/* These links are dynamically created!  (as you can see from the code provided)
 I want to get the number of the link that is pressed.
 - How to do it? 
 Thank you!*/

            }
        }

OriginalGriff

Форматирование кода полностью цветное: но вам может потребоваться выбрать тип исходного кода, чтобы включить его для вашего кода.
Я отредактировал ваш вопрос, чтобы добавить "lang=cs" к вашим тегам "pre", но вы можете получить то же самое, используя раскрывающийся список "код"и выбрав" C#".

_Q12_

Спасибо!

_Q12_

теперь я вижу свою ошибку. Я полагался на автоматическое форматирование, где он вставляет только \<\pre\gt; без упоминания о cs. Но хотя это поток c#, он должен быть выбран по умолчанию. Но отныне я буду помнить, каков правильный путь. Еще раз спасибо.

BillWoodruff

Используете ли вы способность элемента управления LinkLabel содержать несколько ссылок ?

Это Windows Forms ?

_Q12_

Да, он находится в winform.
Я не использую емкость Linklabel для хранения нескольких ссылок. Просто простое использование.

_Q12_

линклейбл.Связи.Добавить(0, 100, ссылка[i]); -или, может быть, я действительно использую его способность и не осознавал этого :)

BillWoodruff

Без этого он не будет функционировать как "связующее звено" :)

2 Ответов

Рейтинг:
9

_Q12_

Я говорю, что это "трудный путь", но, может быть, это нормальный путь. Ну, для меня это работает.
В конце концов, мне удается его закончить. Но я должен был проникнуть в код, чтобы он заработал.

List<LinkLabel> ListLinksVisited = new List<LinkLabel>();
void linklabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
    if (e.Link.LinkData.ToString() != "")
    {
       // Process.Start(e.Link.LinkData.ToString());
        e.Link.Visited = true; //show in list that link is clicked

        for (int i = 0; i < ListLinksVisited.Count; i++)
        {
            //compare the actual string links
            if (ListLinksVisited[i].Links[0].LinkData.ToString() == e.Link.LinkData.ToString())
            {
                ListLinksVisited[i].LinkVisited = true; //intlink = i;
                break;
            }
        }
    }
}


BillWoodruff

Это действительно выглядит сложным, и я думаю, что вы можете упростить его с помощью словаря<LinkLabel, bool> cheers, Bill

Рейтинг:
2

BillWoodruff

Я предлагаю вам реализовать классы, а затем привязать Список для отображения ссылок; используйте сериализацию для сохранения состояния.

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Windows.Forms;

namespace WhatEver

    [DataContract]
    public class LinkData // add Properties for Colors
    {
        [DataMember]
        public bool Visited { set; get; }

        [DataMember]
        public string LblText { set; get; }

        [NonSerialized] 
        public LinkLabel LnkLabl;

        public LinkData()
        {
        }

        public LinkData(string lbltext, bool visited) : this()
        {
            LblText = lbltext;
            Visited = visited;
        }
    }

    [DataContract]
    public class LinksData
    {
        public LinksData()
        {
            TheLinks = new List<LinkData>();
        }

        [DataMember]
        public List<LinkData> TheLinks { set; get; }

        public LinkLabel AddLLabel(string text, bool visited)
        {
            LinkData newlink = new LinkData(text, visited);

            LinkLabel newll = new LinkLabel();

            // set colors, etc.
            
            newll.Text = text;

            newll.Links.Add(0, text.Length, text);

            newlink.LnkLabl = newll;

            TheLinks.Add(newlink);

            return newll;
        }
    }
}
Вы можете сделать что-то вроде этого, чтобы установить LinkLabels на панели, не располагая их вручную:
LinksData lnksdata = new LinksData();

for (int i = 0; i < 10; i++)
{
    LinkLabel llbl = lnksdata.AddLLabel("www.somewhere" + i + ".com", false);

    llbl.LinkClicked  += // your click handler

    panel1.Controls.Add(llbl);

    llbl.Dock = DockStyle.Top;

    llbl.BringToFront();
}
Напишите сериализатор и десериализатор, а затем вы можете сохранить все состояние каждой LinkLabel в одном файле. Обратите внимание, что поскольку вы не можете сериализовать сам элемент управления LinkLabel, вам нужно будет повторно создать их при де-сериализации.