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(キー)またはcrawLocaly1.getText()(キーの値)に変更を加えたときに必要なので、ListBoxでもリアルタイムで変更されます。私はこのようにそれをやろうとしました:

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

ただし、キーが既に存在する場合、またはキーがリストに存在しない場合は、キーの値のみを更新する代わりに、キーとその値を表示せず、新しい行を追加して、新しいキーとその値を ListBox に追加します。 .

ListBox でリアルタイムに更新されるようにするにはどうすればよいですか?


OK ListBox 行を次のように変更しました。

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

今はそれを追加していますが、新しい行として追加しています。それを追加して、ListBoxにすでにmainUrlが存在する行を置き換えてほしい。

また、mainUrl が ListBox に存在しない場合は、その値を新しい行に追加します。ただし、 Key(mainUrl) が ListBox に存在する場合は常に、それを置き換えるか、 value(crawlLocaly1.getText() ) のみを変更します。

4

3 に答える 3

1


書くときに行を修正するLocalyKeyWords[mainUrl]には、オブジェクトを取得しList<string>ます。したがって、このリストを文字列に連結すると、実際にはメソッドが呼び出されますList<string>.ToString()

挿入されたこの行を使用してみてください:

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); 
                } 
            }  
        } 

2 つ以上の変数を含むデータを操作するには、. コントロールを使用することをお勧めしますListView。このコントロールは、リストのように機能する方法を知っており、データを列に分割できます。msdn のListViewを参照してください。

于 2012-10-11T21:28:53.080 に答える
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>();

これらの2行をフォームのコンストラクターに入れます

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 に答える