C#,Microsoft Visual Studio2012で開発してます。foreachでListViewに登録されているItemを順番に読み出して、Webbrowserにnavigateさせるというコードなのですが、思うように動きません。 foreach (ListViewItem urlID in listView1.Items) { this.webBrowser1.Navigate(URL1 + urlID.Text + URL2); }ListViewに登録されているurlIDを最初から最後まで巡っていきたいのです。しかしこのコードだと、最初のIDだけしか出力されないのです。勿論listviewには2つ以上アイテムが登録されています。どうすればいいでしょうか?よろしくお願いします。
■No64612 (lysis さん) に返信 > foreachでListViewに登録されているItemを順番に読み出して、 > Webbrowserにnavigateさせるというコードなのですが、思うように動きません。 もう少し『具体的』に書いて頂けると、状況を想像しやすいです。 > this.webBrowser1.Navigate(URL1 + listviewitm.Text + URL2); 変数 URL1 や URL2 は実際には「URL」ではなく、「URL の一部分」なのでしょうか。 「URL1 + listviewitm.Text + URL2」は、具体的にはどのような文字列を返しますか? > ListViewに登録されているurlIDを最初から最後まで巡っていきたいのです。 urlID というのが何を意味するのか分かりませんが、たとえば、 URL1 = "http://example.com/urlID="; URL2 = "&key=1234"; listView1 = "abcd" "wxyz" "9999" のように登録されていて、それを url = "http://example.com/urlID=abcd;wxyz;9999&key=1234"; のように指定したいという意味なら、下記のように書けます。 private void button1_Click(object sender, EventArgs e) { string URL1 = @"http://example.com/urlID="; string URL2 = @"&key=1234"; string urlID = String.Join(";", from ListViewItem li in listView1.Items select li.Text); Uri url = new Uri(URL1 + urlID + URL2); webBrowser1.Navigate(url); } ----------------------- あるいはアイテムが 3 つあって、それを 3 つの WebBrowser で開かせたいなら たとえばこんな感じ。 // ListView と Button と TabControl を貼っておく private void Form1_Load(object sender, EventArgs e) { listView1.Items.Clear(); listView1.Items.Add("http://www.google.com/"); listView1.Items.Add("http://www.yahoo.co.jp/"); listView1.Items.Add("http://www.bing.com/"); } private void button1_Click(object sender, EventArgs e) { tabControl1.TabPages.Clear(); foreach (ListViewItem li in listView1.Items) { WebBrowser wb = new WebBrowser() { Dock = DockStyle.Fill}; TabPage page = new TabPage("loading..."); page.Controls.Add(wb); wb.DocumentTitleChanged += wb_DocumentTitleChanged; //var url = URL1 + li.Text + URL2; var url = li.Text; wb.Navigate(url); tabControl1.TabPages.Add(page); } } void wb_DocumentTitleChanged(object sender, EventArgs e) { WebBrowser wb = (WebBrowser)sender; TabPage page = (TabPage)wb.Parent; page.Text = wb.DocumentTitle; } ----------------------- あるいは 1 つの WebBrowser で連続的に開かせるなら…。 // ListView と Button と WebBrowser を貼っておく private void Form1_Load(object sender, EventArgs e) { listView1.Items.Clear(); listView1.Items.Add("http://www.google.com/"); listView1.Items.Add("http://www.yahoo.co.jp/"); listView1.Items.Add("http://www.bing.com/"); } IEnumerator<ListViewItem> items = null; private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { NavigateNext(); } private void button1_Click(object sender, EventArgs e) { items = listView1.Items.OfType<ListViewItem>().GetEnumerator(); NavigateNext(); } void NavigateNext() { if (items == null) return; if (items.MoveNext()) { ListViewItem li = items.Current; //var url = URL1 + li.Text + URL2; var url = li.Text; webBrowser1.Navigate(url); } else { items = null; } }
お世話になります。コードがどうも冗長なので何とかもう少しスマートな方法が無いかお尋ねします。やっているのは、計算式を文字列で受け取り答えを返す処理です。例えば"5.5 + calc_1_1(#1)/2 + calc_2_1(#2)*0.1"のような式を受け取るとまず calc_1_1(#1) の部分を実数にします。式に登場する calc_1_1() calc_2_1()は 計算を処理するKeisanクラスの中のメソッドで他にも以下のような種類があります。名前には簡単な正規表現で記述できる程度の規則があります。 calc_1_1(double[] val) calc_1_2(double[] val) calc_1_3(double[] val) calc_1_4(double[] val) calc_2_1(double[] val) calc_2_2(double[] val) calc_2_3(double[] val) calc_2_4(double[] val)今は以下の様なコードなのですが Match match = Regex.Match(strSiki, "calc_[1-4]_[1-4]"); if(match.Success) { if (String.Equals(match.Value, "calc_1_1")) { ans = Keisan.calc_1_1(v); } else if (String.Equals(match.Value, "calc_1_2")) { ans = Keisan.calc_1_2(v); } else if (String.Equals(match.Value, "calc_1_3")) { ans = Keisan.calc_1_3v); ・・・・ ・・・・ ・・・・ ・・・・ ・・・・ }延々と else if を続けて記述していて冗長に感じています。もっとスマートなやり方はないものでしょうか?開発環境は Windows XP SP3 + VS2005 C# .NET 2.0 です。.NETのバージョンを上げればこうできるみたいなアドバイスも歓迎です。どうぞよろしくお願い致します。
- Child Tree -