0

我有一个标签。我有一个清单。当我执行“label1.Text = match.Value;”时,它只显示列表的最后一项,而不是每次单击按钮时都会更改的 1 个字符串。代码是:

private void frontPageToolStripMenuItem_Click(object sender, EventArgs e)
    {
        const string url = "http://reddit.com/r/pics";
        var source = getSource(url);
        var regex = new Regex([regex removed]);
        var links = new List<string>();
        var titles = new List<string>();

        foreach (Match match in regex.Matches(source))
        {
            links.Add(match.Groups[1].Value);
            titles.Add(match.Groups[2].Value);

        }

        foreach (var title in titles)
        {
            label1.Text = title; /*it just shows the last 'title' in 'titles', I want it to start at the first, and go to the next title every time the event occurs (frontPageToolStripMenuItem_Click)*/ 
        }

    }

提前致谢!

4

4 回答 4

4

您需要在单击事件处理程序之外初始化列表。您可以创建一个FetchImageData在程序启动时调用的方法(也许从类的构造函数中调用它)。或者您可以在第一次触发 click 事件时将其称为列表。

private int clickCounter = 0;
private List<string> links;
private List<string> titles;

private void FetchImageData()
{
    links = new List<string>();
    titles = new List<string>();

    const string url = "http://reddit.com/r/pics";
    var source = getSource(url);
    var regex = new Regex([regex removed]);

    foreach (Match match in regex.Matches(source))
    {
        links.Add(match.Groups[1].Value);
        titles.Add(match.Groups[2].Value);
    }
}

您还没有说当用户单击的次数超过元素时会发生什么。一种选择是环绕并从头开始。这可以使用%运算符来实现。

private void frontPageToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (titles == null) { FetchImageData(); }
    label1.Text = titles[clickCounter % titles.Count];
    clickCounter++;
}
于 2012-11-09T13:34:11.507 回答
0

UI 线程没有机会更新标签,因为您的 for 循环位于 UI 线程上。即使您将 for 循环移动到后台线程,您也很有可能只会看到一些闪烁,然后是最后的字符串。只需将字符串附加到文本框或使用 Debug.writeLine 输出它们。这将表明您正在阅读正确的字符串。

要更改标签一次,不要在 for 循环中进行

于 2012-11-09T13:38:00.543 回答
0

在第二个foreach循环中放置label1.Text += title;而不是label1.Text = title;然后它会正常工作。

于 2015-04-29T11:06:51.407 回答
0

1)titles应该是全局变量

2) 在表单的构造函数中移动 this

    const string url = "http://reddit.com/r/pics";
                var source = getSource(url);
                var regex = new Regex("<a class=\"title \" href=\"(.*?)\" >(.*?)<");

        titles = new List<string>();

                foreach (Match match in regex.Matches(source))
                {
                    links.Add(match.Groups[1].Value);
                    titles.Add(match.Groups[2].Value);

                }
label1.Text = first value of the titles

3)您的事件处理程序应该是这样的:

private void frontPageToolStripMenuItem_Click(object sender, EventArgs e)
    {
            label1.Text = next value of the titles variable;

    }
于 2012-11-09T13:39:13.917 回答