1

我有这个按钮点击代码现在正在工作:

private void button6_Click(object sender, EventArgs e)
        {

            using (var w = new StreamWriter(keywords))
            {
                crawlLocaly1 = new CrawlLocaly();
                crawlLocaly1.StartPosition = FormStartPosition.CenterParent;
                DialogResult dr = crawlLocaly1.ShowDialog(this);
                if (dr == DialogResult.OK)
                {
                    if (LocalyKeyWords.ContainsKey(mainUrl))
                    {
                        LocalyKeyWords[mainUrl].Clear();
                        LocalyKeyWords[mainUrl].Add(crawlLocaly1.getText());
                    }
                    else
                    {
                        LocalyKeyWords[mainUrl] = new List<string>();
                        LocalyKeyWords[mainUrl].Add(crawlLocaly1.getText());
                    }
                    Write(w);
                    listBox1.Items.Add("Url: " + LocalyKeyWords[mainUrl] + " --- " + "Localy KeyWord: " + crawlLocaly1.getText());
                }
                if (dr == DialogResult.Cancel)
                {
                    Write(w);
                }
            } 
        }

当我对 mainUrl(key) 或 crawlLocaly1.getText()(key 的值) 进行更改时,我需要它,所以它也会在 ListBox 中实时更改。我试着这样做:

listBox1.Items.Add("Url: " + LocalyKeyWords[mainUrl] + " --- " + "Localy KeyWord: " + crawlLocaly1.getText());

但是它不显示键及其值,并且它添加一个新行而不是仅更新键的值,如果键已经存在或者如果键在列表中不存在,则将新键及其值添加到 ListBox .

我如何制作它以便它会在 ListBox 中实时更新它?


好的,将 ListBox 行更改为:

listBox1.Items.Add("Url: " + mainUrl + " --- " + "Localy KeyWord: " + crawlLocaly1.getText());

现在它添加它很好,但它添加它作为一个新行。我希望它将添加它并替换 ListBox 中已经存在 mainUrl 的行。

如果 ListBox 中不存在 mainUrl,则将其值添加到新行中。但是,如果 ListBox 中存在 Key(mainUrl) ,则始终替换它或仅更改 value(crawlLocaly1.getText() ) 。

4

3 回答 3

1


要在你写的时候更正这条线LocalyKeyWords[mainUrl],你会得到一个List<string>对象。因此,当您将此 List 连接到字符串时,您实际上调用了方法List<string>.ToString()

尝试使用此行 insted:

listBox1.Items.Add("Url: " + mainUrl + " --- " + "Localy KeyWord: " + LocalyKeyWords[mainUrl][0]); 

对于实时问题
要实时编辑该行,您需要删除之前的上一行,就像这样

private void button6_Click(object sender, EventArgs e) 
        { 

            using (var w = new StreamWriter(keywords)) 
            { 
                crawlLocaly1 = new CrawlLocaly(); 
                crawlLocaly1.StartPosition = FormStartPosition.CenterParent; 
                DialogResult dr = crawlLocaly1.ShowDialog(this); 
                if (dr == DialogResult.OK) 
                { 
                    int line = listBox1.Items.Count;
                    if (LocalyKeyWords.ContainsKey(mainUrl)) 
                    { 
                        line = listBox1.Items.IndexOf("Url: " + mainUrl+ " --- " + "Localy KeyWord: " + LocalyKeyWords[mainUrl][0]);

                        listBox1.Items.Remove("Url: " + mainUrl+ " --- " + "Localy KeyWord: " + LocalyKeyWords[mainUrl][0]);
                        LocalyKeyWords[mainUrl].Clear(); 
                        LocalyKeyWords[mainUrl].Add(crawlLocaly1.getText()); 
                    } 
                    else 
                    { 
                        LocalyKeyWords[mainUrl] = new List<string>(); 
                        LocalyKeyWords[mainUrl].Add(crawlLocaly1.getText()); 
                    } 
                    Write(w); 
                    listBox1.Items.Insert(line, "Url: " + mainUrl+ " --- " + "Localy KeyWord: " + LocalyKeyWords[mainUrl][0]);
                } 
                if (dr == DialogResult.Cancel) 
                { 
                    Write(w); 
                } 
            }  
        } 

只是为了您知道,使用包含两个或多个变量的数据。最好使用ListView控件。该控件知道如何像列表一样工作,并且可以将数据拆分为列。请参阅msdn 中的ListView

于 2012-10-11T21:28:53.080 回答
0

如果我理解正确,请尝试以下操作:

// Find the existing item. (s.Contains could be changed to something else, like s.StartsWith.)
var existingItem = listBox1.Items.OfType<string>()
    .FirstOrDefault(s => s.Contains(mainUrl));

if (existingItem != null)
{
    // Item exists, find index of it and change it.
    var index = listBox1.Items.IndexOf(existingItem);
    listBox1.Items[index] = "Url: " + mainUrl + " --- " + "Localy KeyWord: " + crawlLocaly1.getText();
}
else
{
    // Item is new, add it.
    listBox1.Items.Add("Url: " + mainUrl + " --- " + "Localy KeyWord: " + crawlLocaly1.getText());
}
于 2012-10-11T21:42:41.643 回答
0

如果我理解正确,您应该添加以下类:

public class KeyWordWrapper
{
    public string Url { get; private set; }
    public string Value { get; set; }

    public KeyWordWrapper(string url)
    {
        this.Url = url;
    }

    public override string ToString()
    {
        return string.Format("Url: {0} --- Localy KeyWord: {1}", Url, Value);
    }
}

然后定义你LocalyKeyWords的如下:

Dictionary<string, KeyWordWrapper> LocalyKeyWords =
  new Dictionary<string, KeyWordWrapper>();

将这两行放入表单的构造函数中

listBox1.DisplayMember = "Value";
listBox1.DataSource = LocalyKeyWords;

最后更新 button6_Click 如下:

if (dr == DialogResult.OK)
{
    KeyWordWrapper keyWordWrapper;
    if (!LocalyKeyWords.TryGetValue(mainUrl, out keyWordWrapper))
    {
        keyWordWrapper = new KeyWordWrapper(mainUrl);
        LocalyKeyWords.Add(mainUrl, keyWordWrapper);
    }

    keyWordWrapper.Value = crawlLocaly1.getText();
    Write(w);
}
于 2012-10-11T22:06:24.070 回答