2013/05/31(Fri) 15:13:28 編集(投稿者)
2013/05/31(Fri) 14:38:50 編集(投稿者)
<pre><pre>2013/05/31(Fri) 07:12:16 編集(投稿者)
<pre><pre>■No66848 (外山 さん) に返信
> こりんご様、皆様
>
> ■66787でくれた回答について&追加質問
>
> 重複チェックの部分で先日質問しましたが、ちゃんとお伝えできてなかったようなので、再度質問させて頂きます。
>
> 現在はリストボックスごとに、同じURLを入れようとすると
> MessageBox.Show("この記事は既に登録されています");
> と表示がでます。
> つまり、リストボックス1に入れたURLはリストボックス2に入れることが出来てしまっていますが、以下が理想の形です。
> 1、リストボックス1〜5の中に1つも重複が無いようにしたいです。
については出来ていたんですけど
なぜかコードの書き込みが出来なくて。
using Npgsql; //PostgreSQL
using NpgsqlTypes; //PostgreSQL
using System.Text.RegularExpressions; //正規表現
using System.Collections; //ArrayList
namespace FormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
ArrayList urlArray = new ArrayList();
private void Form1_Load(object sender, EventArgs e)
{
for (int i = 1; i <= 5; i++)
{
(Controls["listBox" + i] as ListBox).AllowDrop = true;
(Controls["listBox" + i] as ListBox).DragEnter += new DragEventHandler(listBox_DragEnter);
(Controls["listBox" + i] as ListBox).DragDrop += new DragEventHandler(listBox_DragDrop);
}
}
private void listBox_DragEnter(object sender, DragEventArgs e)
{
//URLのみ受け入れる//@ITより
if (e.Data.GetDataPresent("UniformResourceLocator"))
e.Effect = DragDropEffects.Link;
else
e.Effect = DragDropEffects.None;
}
private void listBox_DragDrop(object sender, DragEventArgs e)
{
//ドロップされたリンクのURLを取得する//@ITより
String url = e.Data.GetData(DataFormats.Text).ToString();
//結果を表示
((ListBox)sender).Text = url;
//MessageBox.Show(url);
//ドロップされたデータがString型か調べる
if (e.Data.GetDataPresent(typeof(String)))
{
ListBox target = (ListBox)sender;
//ドロップされたデータ(String型)を取得
String itemText =
(String)e.Data.GetData(typeof(String));
//ドロップされたデータがまだ未登録の場合
if (urlArray.IndexOf(url) == -1)
{
//ドロップされたデータをリストボックスに追加する
target.Items.Add(url);
//urlArrayにデータを登録する
urlArray.Add(url);
//MessageBox.Show("表示");
}
else
{
//既に登録されていたら
MessageBox.Show("この記事は既に登録されています");
}
}
}
private void button1_Click(object sender, EventArgs e)
{
NpgsqlCommand scm;
NpgsqlConnection scn = new NpgsqlConnection(@""); //データベース名注意
String sql;
Regex re = new Regex(@" (?<hiduke>.+?)配信", RegexOptions.Singleline);
scn.Open();
for (int i = 1; i <= 5; i++)
{
if ((Controls["listBox" + i] as ListBox).Items.Count > 0)
{
sql = string.Format("INSERT INTO item_data{0} VALUES(@url,@date)", i);
scm = new NpgsqlCommand(sql, scn);
NpgsqlParameter sParam1 = new NpgsqlParameter("@url", NpgsqlDbType.Varchar);
NpgsqlParameter sParam2 = new NpgsqlParameter("@date", NpgsqlDbType.Varchar);
for (int m = 0; m <= (Controls["listBox" + i] as ListBox).Items.Count - 1; m++)
{
String url1 = (string)(Controls["listBox" + i] as ListBox).Items[m];
sParam1.Value = url1;
//WebClientの作成
System.Net.WebClient wc = new System.Net.WebClient();
//文字コードを指定
wc.Encoding = System.Text.Encoding.GetEncoding(51932);
//HTMLソースをダウンロードする
string sorce = wc.DownloadString(url1);
//後始末
wc.Dispose();
if (re.IsMatch(sorce))
{
sorce = re.Match(sorce).Groups["hiduke"].Value;
}
else
{
sorce = "None";
}
sParam2.Value = sorce;
scm.Parameters.Clear();
scm.Parameters.Add(sParam1);
scm.Parameters.Add(sParam2);
MessageBox.Show(scn.State.ToString());
scm.ExecuteNonQuery();
}
scm.Dispose();
}
}
MessageBox.Show(string.Format("登録完了!!\r {0}件を登録しました!!",urlArray.Count.ToString()));
urlArray.Clear();
scn.Close();
}
}
}
ただし登録完了後も重複をチェックするようには
作ってませんけど。。。。
> 2、そして、リストボックス1〜5に入れた順番に、WebBrouzerコントロールで一定の時間間隔(例:2分とか)で表示させたいのです。
については完全にお手上げです。
もしかするとBackgroundを使えば良いのかとかSleep関数でいけるのかとか、
思いはあるんですけど形には出来てません。
⇒リストボックスのグループ毎にを無視するなら
ArrayListの配列とSleep関数辺りでいけそうな気もしているのですが。。。</pre></pre>
【追記】
なんとかコードにはなったのですがなぜか迷惑投稿者で載せる事はできませんので、
暫く待ってみましょう。
</pre></pre>