NonSoft

サイト内URLチェック(VB.NET/C#.NET用DLL)


 ダウンロード

サイト内(HTTP)のURL一覧を取得しリンク切れチェックやWEBページ保存をするライブラリ(DLL)

ダウンロード  画面イメージ  使用例(VB.NET)  使用例(C#.NET)   

※ SEO関係のその他のツール、サンプルソースはこちらです。
ページランク/検索順位/インデックス/サイトマップ
====================================================================================================
【タイトル     】サイト内URLチェック(VB.NET/C#.NET用DLL)
【Version      】1.3.1.2
【ファイル     】NonUrlCheck.zip
【圧縮ファイルの中身】NonUrlCheck.dll、ReadMe.txt、サンプルソース、NonPageRank.dll
【動作確認     】Windows8/Windows7/XP/2000 ※VS2005で動作確認しています
【必要ソフト    】Microsoft .NET Framework Version 2.0
【ソフト種別    】フリーソフト ※URLを解析する階層数が1に制限されています
【ソフト種別    】シェアウェア ※機能制限無し(評価期間は最大1ヶ月) ※販売中止!!
【シェアウェア価格 】8,000円(本体価格<税抜き価格です>):消費税10%の場合は8,800円(税込)です
【シェアレジ作品番号】SR205701
【作者/著作権者  】のん
【作者への連絡先  】http://nonsoft.la.coocan.jp/
【最近の主な変更(1) 】スタイルシート(CSS)からのイメージURL取得
【最近の主な変更(2) 】WEBページ保存時に外部イメージを保存(ローカル相対PATHに変更)
【最近の主な変更(3) 】認証プロキシ対応
====================================================================================================
1.はじめに
  本プログラムをダウンロード頂きまして誠にありがとうございます。
  本プログラムはサイト内(ホームページ内)の全てのURL を取得しリンク切れ等をチェックするDLLです。
  サイトの指定にはインターネットのURL(例:http://xxx/xxx/index.html)とローカルディスクのURL(例:c:
  \xxx\xxx\index.html)を指定する事が出来ます。リンク切れチェックと同時に取得したWEBページ をローカ
  ルディスク保存する事が可能です。現在のバージョンではURLを解析する階層数が1に制限されています。

  オプションとしてサンプル版(フリー)のページランク取得DLL(NonPageRank.dll)を同梱しています。
  NonPageRank.dllの永久動作は保障出来ません。NonPageRank.dllのバージョンアップは行いません。
  ネットワーク負荷を考慮し、一度に複数のページランク取得はおやめください。

  (注意)
  未サポートのHTMLタグ(SCRIPT等)がありますのでご利用の環境での十分な評価をお願いします。

  <このライブラリを使用しているツール/同様のアルゴリズムを使用しているツール>
  ※WEB変更履歴ツール(WebBakHist)
   サイト内の全てのWEBページのダウンロード、過去分比較(URL一覧差分/HTML差分/バイナリ差分)
  ※サイト内URLチェック
   サイト内の全てのURLのリンク切れチェック(結果CSV保存)、WEBページ保存

2.インストール方法/アンインストール方法
  本プログラムはインストール操作が必要ありません。
  アンインストール操作も必要ありませんので、本プログラム一式を削除してください。
  Microsoft .NET Framework Version 2.0以上がインストールされている必要があります。

  -------------------------------------------------------------------------------------
  ※VS2010(Microsoft .NET Framework Version 4.0)版は次のURLからダウンロード出来ます。
  VS2010(Microsoft .NET Framework Version 4.0)版のダウンロード
  -------------------------------------------------------------------------------------

3.著作権・ライセンス
  本プログラムの全ての著作権は「のん」が所有しています。
  本プログラムを転載する場合は著作権所有者の許可が必要となります。
  (NonSoftの紹介リンクは問題ありませんので宜しくお願いします)
  また、著作権所有者が許可したサイトでのみダウンロードが可能となります。
  再配布は禁止させて頂きます。商用利用についての制限はありません。
  本プログラムを起動するパソコン一台につき1ライセンスが必要になります。

  <シェアライセンスの取得方法>
  Vector(http://www.vector.co.jp/)でのシェアレジ(シェアレジ作品番号:SR205701) のお手続を
  お願いします。(URL:http://shop.vector.co.jp/service/servlet/NCart.Add?ITEM_NO=SR205701)
  ライセンスキーを取得されましたら、ソースコードのNonUrlCheck.UrlCheckClass.LicenseKeyに入力して
  ください。(注意1)評価期間に十分な評価をされた方のみシェアライセンス取得のお手続が出来ます。

4.免責事項
  本プログラムが原因による損害・問題に対し一切の責任を負えません。
  ご利用者の責任の範囲内でお使いください。

5.作者への問合せについて
  作者への問合せはメールのみとさせて頂きます。
  問合せ内容によっては回答出来ない場合もございますので予めご了承願います。
  また、作者不在時または問い合わせ数が多い場合など、
  回答に日数がかかる場合がございますので予めご了承願います。

<画面イメージ>
サイト内URLチェック(VB.NET/C#.NET用DLL)
<使用例(VB.NET)>
Public Class Form1

    ''' <summary>
    ''' URL情報を取得するDataTable
    ''' </summary>
    ''' <remarks></remarks>
    Private dtUrl As DataTable = Nothing

    ''' <summary>
    ''' ボタンの処理
    ''' </summary>
    ''' <param name="sender">sender</param>
    ''' <param name="e">e</param>
    ''' <remarks></remarks>
    Private Sub Button_Click( _
        ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _
        Button1.Click, Button2.Click, Button3.Click

        If sender Is Button3 Then
            ' 中止ボタン
            NonUrlCheck.UrlCheckClass.CancelFlag = True
            Return
        ElseIf sender Is Button1 Then
            ' 取得ボタン
            dtUrl = Nothing
        ElseIf sender Is Button2 Then
            ' 再取得ボタン(取得ボタンで中止やエラーになったURLの再チェック)
        End If

        ' 進捗状況表示
        Label1.Text = "0 / 0"

        ' ボタン制御
        Button1.Enabled = False
        Button2.Enabled = False
        Button3.Enabled = True
        Button3.Focus()

        ' 処理中止フラグ
        NonUrlCheck.UrlCheckClass.CancelFlag = False

        ' ライセンスキー(URL解析階層数に2以上を設定する場合に必要)
        NonUrlCheck.UrlCheckClass.LicenseKey = ""

        ' URL解析する階層数(例:10)
        NonUrlCheck.UrlCheckClass.UrlLevel = 1

        ' デフォルトインデックス(例:"index.html")
        NonUrlCheck.UrlCheckClass.DefaultIndex = "index.html"

        ' URLを解析するタグおよび属性
        ' (例:"a,href,lnk","form,action,lnk","img,src,img","script,src,etc")
        NonUrlCheck.UrlCheckClass.ChkUrTag = New String() { _
            "a,href,lnk", "form,action,lnk", "frame,src,lnk", "iframe,src,lnk", _
            "img,src,img", "body,background,img", "table,background,img", _
            "tr,background,img", "td,background,img", _
            "script,src,etc"}

        ' CGIと判定するファイルの拡張子(例:"cgi", "pl", "php", "asp", "aspx", "jsp")
        NonUrlCheck.UrlCheckClass.JdgCgiExt = _
            New String() {"cgi", "pl", "php", "asp", "aspx", "jsp"}

        ' [?]を含むURLをCGIと判断するかどうか(例:True)
        NonUrlCheck.UrlCheckClass.JdgQstMrk = True

        ' URLを解析するContent-Type(文字列の一部)(例:"html","plain")
        NonUrlCheck.UrlCheckClass.ChkCnTyp = New String() {"html"}

        ' CGI内部のURL解析をするかどうか(例:False)
        NonUrlCheck.UrlCheckClass.ChkCnTypCgi = False

        ' リンクとして分類するContent-Type(文字列の一部)
        ' (例:"html", "pdf", "plain", "excel", "word", "zip")
        NonUrlCheck.UrlCheckClass.LnkCnTyp = New String() {"html", "pdf"}

        ' CGIをリンクとして分類するかどうか(例:False)
        NonUrlCheck.UrlCheckClass.LnkCnTypCgi = False

        ' 対象外ファイルやフォルダ(フォルダは/で終了)(例:"sitemap.html","bbs/")
        NonUrlCheck.UrlCheckClass.ChkNoFil = New String() {}

        ' WEBページのディスク保存フォルダ(例:"C:\Temp\Html")
        NonUrlCheck.UrlCheckClass.WebSaveFolder = ""

        ' URL取得処理間隔(秒)(例:0.1)
        NonUrlCheck.UrlCheckClass.WebThreadSlp = 0.1

        ' URL取得同時処理数(例:10)
        NonUrlCheck.UrlCheckClass.WebThreadNum = 10

        ' WEB受信タイムアウト時間(秒)(例:15)
        NonUrlCheck.UrlCheckClass.WebTimeout = 15

        ' プロキシサーバー(例:"localhost:8080")
        NonUrlCheck.UrlCheckClass.ProxyServer = ""

        ' 初期処理
        NonUrlCheck.UrlCheckClass.Initialize()

        ' URL情報を取得するDataTable初期化
        dtUrl = NonUrlCheck.UrlCheckClass.InitDtUrl(TextBox1.Text, dtUrl)

        ' サイト内全URL取得
        Dim idx As Integer = 0
        Do While idx < dtUrl.Rows.Count
            ' 進捗状況表示
            Label2.Text = dtUrl.Rows(idx)("Url").ToString()

            ' サイト内全URL取得(1URLづつ解析)
            NonUrlCheck.UrlCheckClass.GetAllUrl(dtUrl, idx)
            idx += 1

            ' 進捗状況表示
            Label1.Text = idx & " / " & dtUrl.Rows.Count
        Loop

        ' 終了処理
        NonUrlCheck.UrlCheckClass.Terminate()

        ' とりあえず再表示
        Label2.Text = ""
        Application.DoEvents()

        ' ボタン制御
        Button1.Enabled = True
        Button2.Enabled = True
        Button3.Enabled = False

        ' URL一覧表示
        RadioButton1.Checked = False
        RadioButton1.Checked = True
    End Sub

    ''' <summary>
    ''' ラジオボタンの処理
    ''' </summary>
    ''' <param name="sender">sender</param>
    ''' <param name="e">e</param>
    ''' <remarks></remarks>
    Private Sub RadioButton_CheckedChanged( _
        ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged, _
                RadioButton3.CheckedChanged, RadioButton4.CheckedChanged, _
                RadioButton5.CheckedChanged, RadioButton6.CheckedChanged, _
                RadioButton7.CheckedChanged

        If dtUrl Is Nothing Then Return
        Dim selRows As DataRow() = Nothing
        If sender Is RadioButton1 AndAlso RadioButton1.Checked Then
            ' 内部リンク
            selRows = dtUrl.Select("Typ = 'lnk' AND Out = '0'")
        ElseIf sender Is RadioButton2 AndAlso RadioButton2.Checked Then
            ' 内部イメージ
            selRows = dtUrl.Select("Typ = 'img' AND Out = '0'")
        ElseIf sender Is RadioButton3 AndAlso RadioButton3.Checked Then
            ' 内部その他
            selRows = dtUrl.Select("Typ = 'etc' AND Out = '0'")
        ElseIf sender Is RadioButton4 AndAlso RadioButton4.Checked Then
            ' 外部リンク
            selRows = dtUrl.Select("Typ = 'lnk' AND Out = '1'")
        ElseIf sender Is RadioButton5 AndAlso RadioButton5.Checked Then
            ' 外部イメージ
            selRows = dtUrl.Select("Typ = 'img' AND Out = '1'")
        ElseIf sender Is RadioButton6 AndAlso RadioButton6.Checked Then
            ' 外部その他
            selRows = dtUrl.Select("Typ = 'etc' AND Out = '1'")
        ElseIf sender Is RadioButton7 AndAlso RadioButton7.Checked Then
            ' エラー
            selRows = dtUrl.Select("Sts = '×'")
        End If

        ' URL一覧表示
        If selRows Is Nothing = False Then
            DataGridView1.Rows.Clear()
            For i As Integer = 0 To selRows.Length - 1
                ' URL一覧表示(1件づつ追加)
                DataGridView1.Rows.Add()
                DataGridView1.Rows(i).Cells("No").Value = ("" & (i + 1))
                DataGridView1.Rows(i).Cells("Url").Value = selRows(i)("Url").ToString()
                DataGridView1.Rows(i).Cells("Dir").Value = selRows(i)("Dir").ToString()
                DataGridView1.Rows(i).Cells("Ttl").Value = selRows(i)("Ttl").ToString()
                DataGridView1.Rows(i).Cells("Typ").Value = selRows(i)("Typ").ToString()
                DataGridView1.Rows(i).Cells("Out").Value = selRows(i)("Out").ToString()
                DataGridView1.Rows(i).Cells("Lvl").Value = selRows(i)("Lvl").ToString()
                DataGridView1.Rows(i).Cells("Frm").Value = selRows(i)("Frm").ToString()
                DataGridView1.Rows(i).Cells("Sts").Value = selRows(i)("Sts").ToString()
                DataGridView1.Rows(i).Cells("Err").Value = selRows(i)("Err").ToString()
            Next
            ' 件数表示
            Label1.Text = selRows.Length & " / " & dtUrl.Rows.Count
            ' ソート
            DataGridView1.Sort(Url, System.ComponentModel.ListSortDirection.Ascending)
        End If
    End Sub

    ''' <summary>
    ''' DataGridViewのソート処理
    ''' </summary>
    ''' <param name="sender">sender</param>
    ''' <param name="e">e</param>
    ''' <remarks></remarks>
    Private Sub DataGridView1_SortCompare( _
        ByVal sender As System.Object, _
        ByVal e As System.Windows.Forms.DataGridViewSortCompareEventArgs) _
        Handles DataGridView1.SortCompare

        If e.Column.Name = "Url" Or e.Column.Name = "No" Then
            Dim dir1 As String = DataGridView1.Rows(e.RowIndex1).Cells("Dir").Value.ToString()
            Dim dir2 As String = DataGridView1.Rows(e.RowIndex2).Cells("Dir").Value.ToString()
            e.SortResult = System.String.Compare(dir1, dir2, System.StringComparison.Ordinal)
            If e.SortResult = 0 Then
                Dim url1 As String = DataGridView1.Rows(e.RowIndex1).Cells("Url").Value.ToString()
                Dim url2 As String = DataGridView1.Rows(e.RowIndex2).Cells("Url").Value.ToString()
                If url1.LastIndexOf(NonUrlCheck.UrlCheckClass.DefaultIndex) = _
                    url1.Length - NonUrlCheck.UrlCheckClass.DefaultIndex.Length Then
                    e.SortResult = -1
                ElseIf url2.LastIndexOf(NonUrlCheck.UrlCheckClass.DefaultIndex) = _
                    url2.Length - NonUrlCheck.UrlCheckClass.DefaultIndex.Length Then
                    e.SortResult = +1
                Else
                    e.SortResult = _
                        System.String.Compare(url1, url2, System.StringComparison.Ordinal)
                End If
            End If
            e.Handled = True
        Else
            e.SortResult = System.String.Compare( _
                e.CellValue1.ToString(), e.CellValue2.ToString(), _
                System.StringComparison.Ordinal)
            e.Handled = True
        End If
    End Sub

    ''' <summary>
    ''' DataGridViewのソート完了時の処理
    ''' </summary>
    ''' <param name="sender">sender</param>
    ''' <param name="e">e</param>
    ''' <remarks></remarks>
    Private Sub DataGridView1_Sorted( _
        ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles DataGridView1.Sorted

        For i As Integer = 0 To DataGridView1.Rows.Count - 1
            DataGridView1.Rows(i).Cells("No").Value = ("" & (i + 1))
        Next
    End Sub

End Class

<使用例(C#.NET)>
namespace CsNetAp
{
    public partial class Form1 : Form
    {
        /// <summary>
        /// URL情報を取得するDataTable
        /// </summary>
        private DataTable dtUrl = null;

        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// ボタンの処理
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void Button_Click(object sender, EventArgs e)
        {
            if (sender == Button3)
            {
                // 中止ボタン
                NonUrlCheck.UrlCheckClass.CancelFlag = true;
                return;
            }
            else if (sender == Button1)
            {
                // 取得ボタン
                dtUrl = null;
            }
            else if (sender == Button2)
            {
                // 再取得ボタン(取得ボタンで中止やエラーになったURLの再チェック)
            }

            // 進捗状況表示
            Label1.Text = "0 / 0";

            // ボタン制御
            Button1.Enabled = false;
            Button2.Enabled = false;
            Button3.Enabled = true;
            Button3.Focus();

            // 処理中止フラグ
            NonUrlCheck.UrlCheckClass.CancelFlag = false;

            // ライセンスキー(URL解析階層数に2以上を設定する場合に必要)
            NonUrlCheck.UrlCheckClass.LicenseKey = "";

            // URL解析する階層数(例:10)
            NonUrlCheck.UrlCheckClass.UrlLevel = 1;

            // デフォルトインデックス(例:"index.html")
            NonUrlCheck.UrlCheckClass.DefaultIndex = "index.html";

            // URLを解析するタグおよび属性
            // (例:"a,href,lnk","form,action,lnk","img,src,img","script,src,etc")
            NonUrlCheck.UrlCheckClass.ChkUrTag = new String[] {
                "a,href,lnk", "form,action,lnk", "frame,src,lnk", "iframe,src,lnk", 
                "img,src,img", "body,background,img", "table,background,img", 
                "tr,background,img", "td,background,img", 
                "script,src,etc"};

            // CGIと判定するファイルの拡張子(例:"cgi", "pl", "php", "asp", "aspx", "jsp")
            NonUrlCheck.UrlCheckClass.JdgCgiExt = 
                new String[] {"cgi", "pl", "php", "asp", "aspx", "jsp"};

            // [?]を含むURLをCGIと判断するかどうか(例:True)
            NonUrlCheck.UrlCheckClass.JdgQstMrk = true;

            // URLを解析するContent-Type(文字列の一部)(例:"html","plain")
            NonUrlCheck.UrlCheckClass.ChkCnTyp = new String[] { "html" };

            // CGI内部のURL解析をするかどうか(例:False)
            NonUrlCheck.UrlCheckClass.ChkCnTypCgi = false;

            // リンクとして分類するContent-Type(文字列の一部)
            // (例:"html", "pdf", "plain", "excel", "word", "zip")
            NonUrlCheck.UrlCheckClass.LnkCnTyp = new String[] { "html", "pdf" };

            // CGIをリンクとして分類するかどうか(例:False)
            NonUrlCheck.UrlCheckClass.LnkCnTypCgi = false;

            // 対象外ファイルやフォルダ(フォルダは/で終了)(例:"sitemap.html","bbs/")
            NonUrlCheck.UrlCheckClass.ChkNoFil = new String[] { };

            // WEBページのディスク保存フォルダ(例:"C:\Temp\Html")
            NonUrlCheck.UrlCheckClass.WebSaveFolder = "";

            // URL取得処理間隔(秒)(例:0.1)
            NonUrlCheck.UrlCheckClass.WebThreadSlp = 0.1;

            // URL取得同時処理数(例:10)
            NonUrlCheck.UrlCheckClass.WebThreadNum = 10;

            // WEB受信タイムアウト時間(秒)(例:15)
            NonUrlCheck.UrlCheckClass.WebTimeout = 15;

            // プロキシサーバー(例:"localhost:8080")
            NonUrlCheck.UrlCheckClass.ProxyServer = "";

            // 初期処理
            NonUrlCheck.UrlCheckClass.Initialize();

            // URL情報を取得するDataTable初期化
            dtUrl = NonUrlCheck.UrlCheckClass.InitDtUrl(TextBox1.Text, dtUrl);

            // サイト内全URL取得
            int idx = 0;
            while (idx < dtUrl.Rows.Count)
            {
                // 進捗状況表示
                Label2.Text = dtUrl.Rows[idx]["Url"].ToString();

                // サイト内全URL取得(1URLづつ解析)
                NonUrlCheck.UrlCheckClass.GetAllUrl(dtUrl, ref idx);
                idx += 1;

                // 進捗状況表示
                Label1.Text = idx + " / " + dtUrl.Rows.Count;
            }

            // 終了処理
            NonUrlCheck.UrlCheckClass.Terminate();

            // とりあえず再表示
            Label2.Text = "";
            Application.DoEvents();

            // ボタン制御
            Button1.Enabled = true;
            Button2.Enabled = true;
            Button3.Enabled = false;

            // URL一覧表示
            RadioButton1.Checked = false;
            RadioButton1.Checked = true;
        }

        /// <summary>
        /// ラジオボタンの処理
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void RadioButton_CheckedChanged(object sender, EventArgs e)
        {
            if (dtUrl == null) return;
            DataRow[] selRows = null;
            if(sender == RadioButton1 && RadioButton1.Checked){
                // 内部リンク
                selRows = dtUrl.Select("Typ = 'lnk' AND Out = '0'");
            }
            else if (sender == RadioButton2 && RadioButton2.Checked)
            {
                // 内部イメージ
                selRows = dtUrl.Select("Typ = 'img' AND Out = '0'");
            }
            else if (sender == RadioButton3 && RadioButton3.Checked)
            {
                // 内部その他
                selRows = dtUrl.Select("Typ = 'etc' AND Out = '0'");
            }
            else if (sender == RadioButton4 && RadioButton4.Checked)
            {
                // 外部リンク
                selRows = dtUrl.Select("Typ = 'lnk' AND Out = '1'");
            }
            else if (sender == RadioButton5 && RadioButton5.Checked)
            {
                // 外部イメージ
                selRows = dtUrl.Select("Typ = 'img' AND Out = '1'");
            }
            else if (sender == RadioButton6 && RadioButton6.Checked)
            {
                // 外部その他
                selRows = dtUrl.Select("Typ = 'etc' AND Out = '1'");
            }
            else if (sender == RadioButton7 && RadioButton7.Checked)
            {
                // エラー
                selRows = dtUrl.Select("Sts = '×'");
            }

            // URL一覧表示
            if (selRows != null)
            {
                DataGridView1.Rows.Clear();
                for (int i = 0; i <= selRows.Length - 1; i++)
                {
                    // URL一覧表示(1件づつ追加)
                    DataGridView1.Rows.Add();
                    DataGridView1.Rows[i].Cells["No"].Value = ("" + (i + 1));
                    DataGridView1.Rows[i].Cells["Url"].Value = selRows[i]["Url"].ToString();
                    DataGridView1.Rows[i].Cells["Dir"].Value = selRows[i]["Dir"].ToString();
                    DataGridView1.Rows[i].Cells["Ttl"].Value = selRows[i]["Ttl"].ToString();
                    DataGridView1.Rows[i].Cells["Typ"].Value = selRows[i]["Typ"].ToString();
                    DataGridView1.Rows[i].Cells["Out"].Value = selRows[i]["Out"].ToString();
                    DataGridView1.Rows[i].Cells["Lvl"].Value = selRows[i]["Lvl"].ToString();
                    DataGridView1.Rows[i].Cells["Frm"].Value = selRows[i]["Frm"].ToString();
                    DataGridView1.Rows[i].Cells["Sts"].Value = selRows[i]["Sts"].ToString();
                    DataGridView1.Rows[i].Cells["Err"].Value = selRows[i]["Err"].ToString();
                }
                // 件数表示
                Label1.Text = selRows.Length + " / " + dtUrl.Rows.Count;
                // ソート
                DataGridView1.Sort(Url, System.ComponentModel.ListSortDirection.Ascending);
            }
        }

        /// <summary>
        /// DataGridViewのソート処理
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void DataGridView1_SortCompare(
            object sender, DataGridViewSortCompareEventArgs e)
        {
            if( e.Column.Name == "Url" || e.Column.Name == "No" )
            {
                String dir1 = DataGridView1.Rows[e.RowIndex1].Cells["Dir"].Value.ToString();
                String dir2 = DataGridView1.Rows[e.RowIndex2].Cells["Dir"].Value.ToString();
                e.SortResult = System.String.Compare(
                    dir1, dir2, System.StringComparison.Ordinal);
                if (e.SortResult == 0)
                {
                    String url1 = DataGridView1.Rows[e.RowIndex1].Cells["Url"].Value.ToString();
                    String url2 = DataGridView1.Rows[e.RowIndex2].Cells["Url"].Value.ToString();
                    if (url1.LastIndexOf(NonUrlCheck.UrlCheckClass.DefaultIndex) ==
                        url1.Length - NonUrlCheck.UrlCheckClass.DefaultIndex.Length)
                    {
                        e.SortResult = -1;
                    }
                    else if (url2.LastIndexOf(NonUrlCheck.UrlCheckClass.DefaultIndex) ==
                        url2.Length - NonUrlCheck.UrlCheckClass.DefaultIndex.Length)
                    {
                        e.SortResult = +1;
                    }
                    else
                    {
                        e.SortResult = System.String.Compare(url1, url2, 
                            System.StringComparison.Ordinal);
                    }
                }
                e.Handled = true;
            }
            else
            {
                e.SortResult = System.String.Compare(
                    e.CellValue1.ToString(), e.CellValue2.ToString(), 
                    System.StringComparison.Ordinal);
                e.Handled = true;
            }
        }

        /// <summary>
        /// DataGridViewのソート完了時の処理
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void DataGridView1_Sorted(object sender, EventArgs e)
        {
            for (int i = 0; i <= DataGridView1.Rows.Count - 1; i++)
            {
                DataGridView1.Rows[i].Cells["No"].Value = ("" + (i + 1));
            }
        }
    }
}