<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>.Net(VB、C#) &#8211; REONTOSANTA</title>
	<atom:link href="https://knowledge.reontosanta.com/archives/category/programming/net/feed" rel="self" type="application/rss+xml" />
	<link>https://knowledge.reontosanta.com</link>
	<description>Collection of personal knowledge</description>
	<lastBuildDate>Wed, 25 Jul 2018 02:16:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<atom:link rel='hub' href='https://knowledge.reontosanta.com/?pushpress=hub'/>
<site xmlns="com-wordpress:feed-additions:1">83369280</site>	<item>
		<title>SQLServerでDataTableの内容を一度のSQLでデータベースに更新する</title>
		<link>https://knowledge.reontosanta.com/archives/1054</link>
					<comments>https://knowledge.reontosanta.com/archives/1054#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Fri, 23 Jun 2017 07:55:06 +0000</pubDate>
				<category><![CDATA[.Net(VB、C#)]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=1054</guid>

					<description><![CDATA[DataTable の内容をデータベースに登録、または更新したい場合&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>DataTable の内容をデータベースに登録、または更新したい場合がある。<br />
しかし、DataTable の行をループしながら行毎に INSERT 文や UPDATE 文を発行すると IO 負荷が高くなり、パフォーマンスが悪化する。<br />
そこで、SQL Server のユーザー定義テーブル型を使用することにより一括での更新が可能となる。</p>
<p>前提条件：SQL Server 2008 以降</p>
<p>&nbsp;</p>
<h2>IO負荷が高い例</h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">Sub Test(ByVal dt As DataTable)
    Dim con As New SqlConnection("connection string")
    Dim cmd As New SqlCommand
    Dim sql As New StringBuilder
    con.Open()
    cmd.Connection = con
    cmd.Parameters.Clear()
 
    'データテーブルの行分だけループしている悪い例
    For i As Integer = 0 To dt.Rows.Count - 1
        sql.AppendLine("INSERT INTO dbo.T_TEST ")
        sql.AppendLine("( ")
        sql.AppendLine("  CODE ")
        sql.AppendLine(") VALUES ( ")
        sql.AppendLine("  @Code ")
        sql.AppendLine("); ")
 
        'パラメータの作成
        Dim param = New SqlParameter("@Code", SqlDbType.Int, ParameterDirection.Input)
        param.Value = dt.Rows(i).Item(0).ToString()
        'パラメータを渡します。
        cmd.Parameters.Add(param)
 
        'プロシージャの実行
        cmd.CommandType = CommandType.Text
        cmd.CommandText = sql.ToString()
        cmd.ExecuteNonQuery
    Next i
End Sub</pre><p>まずは、悪例としてデータテーブルのレコードを 1 件ずつ INSERT していく方法。<br />
上記の方法だと件数が少なければ問題が無いように感じるが、１万件を超えてくるとそのパフォーマンスの悪さが目立ってくる。<br />
１万件のデータをループして INSERT すると１万回の IO 処理となり、オーバーヘッドが大きくなる。<br />
しかし、次の方法で INSERT すると１回の IO 処理で済む為、更新するデータ量は変わらないがかなりのパフォーマンス改善が見込まれる。</p>
<p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-1644917846"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>DataTableをパラメータとして渡す</h2>
<p>DataTable をパラメータとして渡す為には、SQL Server 側にユーザー定義テーブル型を作成しておく必要がある。</p><pre class="urvanov-syntax-highlighter-plain-tag">CREATE TYPE TestTableType AS TABLE
(
  TestCode int NOT NULL
)
GO</pre><p>テーブルの定義と同様に括弧の中にフィールド定義を記述する。<br />
テーブルで定義できるフィールドはTableTypeでも定義可能。</p>
<p>続いて、プログラム側の処理。</p><pre class="urvanov-syntax-highlighter-plain-tag">Sub Test(ByVal dt As DataTable)
    Dim con As New SqlConnection("connection string")
    Dim cmd As New SqlCommand
    Dim sql As New StringBuilder
    con.Open()
    cmd.Connection = con
    cmd.Parameters.Clear()
 
    sql.AppendLine("INSERT INTO dbo.T_TEST ")
    sql.AppendLine("      ( ")
    sql.AppendLine("        CODE ")
    sql.AppendLine("      ) ")
    sql.AppendLine(" SELECT TestCode ")
    sql.AppendLine("   FROM @TestTable ")
    sql.AppendLine("  WHERE TestCode = @Code ")
    sql.AppendLine("); ")
  
    'パラメータの作成
    Dim params(1) As SqlParameters
    params(0) = New SqlParameter("@Code", SqlDbType.Int, ParameterDirection.Input)
    params(0).Value = 1
    params(1) = New SqlParameter("@TestTable", SqlDbType.Structured, ParameterDirection.Input)  'TypeにSqlDbType.Structuredを渡します。
    params(1).TypeName = "TestTableType"  'テーブルタイプの名称を渡します。
    params(1).Value = dt    '編集したデータテーブルを渡します。
    'パラメータ配列を渡します。
    cmd.Parameters.AddRange(params)
    'プロシージャの実行
    cmd.CommandType = CommandType.StoredProcedure
    cmd.CommandText = sql.ToString()
    cmd.ExecuteNonQuery
End Sub</pre><p>ユーザー定義テーブル型を使用することで DataTable をテーブルのように渡すことができる為、一括で SELECT して INSERT または UPDATE が可能となる。</p>
<h4>&lt;注意事項&gt;</h4>
<ul>
<li>DataTable のフィールドはユーザー定義テーブル型のフィールドと一致している必要がある。</li>
<li>ユーザー定義テーブル型を渡す場合は、SqlDbType.Structured で渡す。</li>
</ul>
<p>&nbsp;</p>
<p>ユーザー定義テーブル型を作成しておく必要はあるが、こちらの方法であれば実行速度が圧倒的に速く、パフォーマンス改善が期待できる。<br />
デメリットとしては、ループせずに一括で更新する為、プログレスバーなどで進捗を表示することができない。</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-3411462827"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-2016648512"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/1054/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1054</post-id>	</item>
		<item>
		<title>.net(VB、C#)でLINQを利用してCSVファイルを読み込む</title>
		<link>https://knowledge.reontosanta.com/archives/1006</link>
					<comments>https://knowledge.reontosanta.com/archives/1006#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Sun, 23 Apr 2017 01:25:46 +0000</pubDate>
				<category><![CDATA[.Net(VB、C#)]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=1006</guid>

					<description><![CDATA[LINQでCSVファイルを読み込む .NETには、CSVファイルを読&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<h2>LINQでCSVファイルを読み込む</h2>
<p>.NETには、CSVファイルを読み取る際に便利なクラス(TextFieldParser)が「VB.NET」のライブラリに存在する。</p>
<p>このクラスを利用してCSVファイルをLINQで簡潔に扱えるようにする。</p>
<p>まず、CSVファイルへのコンテキストを生成する為のTextFieldクラスを作成する。</p>
<p>このクラスのContextメソッドでコンテキストを生成することでロジックを意識することなくCSVファイルの読み込みが可能になる。</p><pre class="urvanov-syntax-highlighter-plain-tag">Imports System.Text
Imports System.IO
Imports Microsoft.VisualBasic.FileIO

Public Class TextField
    ' 指定されたCSVファイルへのコンテキストを生成する
    Public Shared Function Context(path As String,
                                   Optional separator As String = ",",
                                   Optional myEncoding As Encoding = Nothing) As IEnumerable(Of String())

        Dim results As New List(Of String())

        Using stream As Stream = New FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)

            Using parser As New TextFieldParser(stream, If(myEncoding, Encoding.UTF8), True, False)

                parser.TextFieldType = FieldType.Delimited
                parser.Delimiters = New String() {separator}
                parser.HasFieldsEnclosedInQuotes = True
                parser.TrimWhiteSpace = True

                While parser.EndOfData = False
                    Dim fields As String() = parser.ReadFields()
                    results.Add(fields)
                End While
            End Using
        End Using

        Return results
    End Function

End Class</pre><p>&nbsp;</p><pre class="urvanov-syntax-highlighter-plain-tag">using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Microsoft.VisualBasic.FileIO;

namespace CS_CSVtoLINQ
{
    public class TextField
    {
        // 指定されたCSVファイルへのコンテキストを生成する
        public static IEnumerable&lt;string[]&gt; Context(string path,
                                                    string separator = ",",
                                                    Encoding encoding = null)
        {
            using (Stream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                using (TextFieldParser parser = new TextFieldParser(stream, encoding ?? Encoding.UTF8, true, false))
                {
                    parser.TextFieldType = FieldType.Delimited;
                    parser.Delimiters = new[] { separator };
                    parser.HasFieldsEnclosedInQuotes = true;
                    parser.TrimWhiteSpace = true;
                    while (parser.EndOfData == false)
                    {
                        string[] fields = parser.ReadFields();
                        yield return fields;
                    }
                }
            }
        }
    }
}</pre><p>&nbsp;</p>
<p>次は、実際にTextFieldクラスを利用してコンテキストを生成し、CSVファイルへアクセスしてLINQにより入力した条件に一致するレコードデータを表示するコードを記述する。</p>
<p>尚、AsParallel()メソッドを呼び出すことで条件判定をマルチスレッド化できるので、データ量が多い場合は、並列化による高速化が期待できる。</p><pre class="urvanov-syntax-highlighter-plain-tag">Imports System.Text
Imports System.IO

Module Module1

    Sub Main()
        Do
            ' 検索条件に使用するIDの入力を求める
            Console.WriteLine("IDを入力")
            Dim input As String = Console.ReadLine()

            ' 入力された値から終了判定
            If input.ToUpper = "END" OrElse input.ToUpper = "EXIT" Then
                ' "END"、または"EXIT"が入力された場合は終了
                Exit Do
            End If

            ' 指定したCSVファイルへのコンテキストを生成
            Dim context As IEnumerable(Of String()) = TextField.Context("CSV\\SAMPLE001.csv", ",", Encoding.GetEncoding("Shift_JIS"))

            ' 取得したコンテキストを入力されたIDをキーに検索
            Dim results As IEnumerable(Of String) =
                From fields In context.AsParallel()
                Where fields(0).Equals(input)
                Select String.Format("{0}：{1}", fields(1), fields(2))

            ' 検索結果を出力
            For Each result As String In results
                Console.WriteLine(result)
            Next
            Console.WriteLine("---END---")
        Loop

    End Sub

End Module</pre><p>&nbsp;</p><pre class="urvanov-syntax-highlighter-plain-tag">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CS_CSVtoLINQ
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                // 検索条件に使用するIDの入力を求める
                Console.WriteLine("IDを入力");
                string input = Console.ReadLine();

                // 入力された値から終了判定
                if (input.ToUpper().Equals("END") || input.ToUpper().Equals("EXIT"))
                {
                    // "END"、または"EXIT"が入力された場合は終了
                    break;
                }

                // 指定したCSVファイルへのコンテキストを生成
                IEnumerable&lt;string[]&gt; context = TextField.Context("CSV\\SAMPLE001.csv", ",", Encoding.GetEncoding("Shift_JIS"));

                // 取得したコンテキストを入力されたIDをキーに検索
                IEnumerable&lt;string&gt; results = 
                    from fields in context.AsParallel()
                    where fields[0].Equals(input)
                    select String.Format("{0}：{1}", fields[1], fields[2]);

                // 検索結果を出力
                foreach (string result in results)
                {
                    Console.WriteLine(result);
                }
                Console.WriteLine("---END---");
            }
        }
    }
}</pre><p>&nbsp;</p>
<p>複数ファイルを跨いで検索する場合は以下のように記述することができる。</p>
<p>※全てのファイルレイアウトが同じ場合</p><pre class="urvanov-syntax-highlighter-plain-tag">Imports System.Text
Imports System.IO

Module Module1

    Sub Main()
        Do
            ' 検索条件に使用するIDの入力を求める
            Console.WriteLine("IDを入力")
            Dim input As String = Console.ReadLine()

            ' 入力された値から終了判定
            If input.ToUpper = "END" OrElse input.ToUpper = "EXIT" Then
                ' "END"、または"EXIT"が入力された場合は終了
                Exit Do
            End If

            ' 指定したCSVファイルへのコンテキストを生成して、入力されたIDをキーに検索
            Dim results As IEnumerable(Of String) =
                From path In Directory.GetFiles("CSV", "*.csv", SearchOption.AllDirectories).AsParallel()
                From fields In TextField.Context(path, ",", Encoding.GetEncoding("Shift_JIS"))
                Where fields(0).Equals(input)
                Select String.Format("{0}：{1}", fields(1), fields(2))

            ' 検索結果を出力
            For Each result As String In results
                Console.WriteLine(result)
            Next
            Console.WriteLine("---END---")
        Loop

    End Sub

End Module</pre><p>&nbsp;</p><pre class="urvanov-syntax-highlighter-plain-tag">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace CS_CSVtoLINQ
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                // 検索条件に使用するIDの入力を求める
                Console.WriteLine("IDを入力");
                string input = Console.ReadLine();

                // 入力された値から終了判定
                if (input.ToUpper().Equals("END") || input.ToUpper().Equals("EXIT"))
                {
                    // "END"、または"EXIT"が入力された場合は終了
                    break;
                }

                // 指定したCSVファイルへのコンテキストを生成して、入力されたIDをキーに検索
                IEnumerable&lt;string&gt; results = 
                    from path in Directory.GetFiles("CSV", "*.csv", SearchOption.AllDirectories).AsParallel()
                    from fields in TextField.Context(path, ",", Encoding.GetEncoding("Shift_JIS"))
                    where fields[0].Equals(input)
                    select String.Format("{0}：{1}", fields[1], fields[2]);

                // 検索結果を出力
                foreach (string result in results)
                {
                    Console.WriteLine(result);
                }
                Console.WriteLine("---END---");
            }
        }
    }
}</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-3190339476"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-1582073825"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/1006/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1006</post-id>	</item>
		<item>
		<title>.net(VB、C#)でWindowの列挙を行う</title>
		<link>https://knowledge.reontosanta.com/archives/990</link>
					<comments>https://knowledge.reontosanta.com/archives/990#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Sun, 04 Dec 2016 23:46:30 +0000</pubDate>
				<category><![CDATA[.Net(VB、C#)]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=990</guid>

					<description><![CDATA[API関数のEnumWindowsを使うことで、全てのウィンドウのハ&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>API関数のEnumWindowsを使うことで、全てのウィンドウのハンドル(HWND)を取得する事ができる。</p>
<p>EnumWindowsを呼び出すと、コールバックメソッドが呼び出され、存在する個々のウィンドウのHWNDが渡される。</p>
<p>以下の例では、EnumWindows()でウィンドウを列挙し、コールバックメソッド内ではIsWindowVisible()を使って可視ウィンドウかどうかを調べている。</p>
<p>また、個々の可視ウィンドウについて、GetWindowText()を使ってウィンドウのキャプションを、GetWindowThreadProcessId()とProcess.GetProcessByIdを使ってプロセス情報を取得・表示している。</p>
<p>&nbsp;</p><pre class="urvanov-syntax-highlighter-plain-tag">Module Module1
    Public Class Sample
        ''' &lt;summary&gt;
        ''' ウィンドウを列挙します。
        ''' &lt;/summary&gt;
        ''' &lt;param name="lpEnumFunc"&gt;コールバック関数&lt;/param&gt;
        ''' &lt;param name="lParam"&gt;アプリケーション定義の値&lt;/param&gt;
        ''' &lt;returns&gt;&lt;/returns&gt;
        ''' &lt;remarks&gt;&lt;/remarks&gt;
        &lt;System.Runtime.InteropServices.DllImport("user32.dll")&gt;
        Public Shared Function EnumWindows(ByVal lpEnumFunc As EnumWinProc, ByVal lParam As IntPtr) As Boolean
        End Function

        ''' &lt;summary&gt;
        ''' EnumWindowsから呼び出されるコールバック関数EnumWinProcのデリゲート
        ''' &lt;/summary&gt;
        ''' &lt;param name="hWnd"&gt;ウィンドウのハンドル&lt;/param&gt;
        ''' &lt;param name="lParam"&gt;アプリケーション定義の値&lt;/param&gt;
        ''' &lt;returns&gt;&lt;/returns&gt;
        ''' &lt;remarks&gt;&lt;/remarks&gt;
        Public Delegate Function EnumWinProc(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As Boolean

        ''' &lt;summary&gt;
        ''' ウィンドウハンドルからキャプションを取得します。
        ''' &lt;/summary&gt;
        ''' &lt;param name="hWnd"&gt;ウィンドウのハンドル&lt;/param&gt;
        ''' &lt;param name="lpString"&gt;キャプション&lt;/param&gt;
        ''' &lt;param name="nMaxCount"&gt;キャプションの最大桁数&lt;/param&gt;
        ''' &lt;returns&gt;&lt;/returns&gt;
        ''' &lt;remarks&gt;&lt;/remarks&gt;
        &lt;System.Runtime.InteropServices.DllImport("user32.dll", CharSet:=System.Runtime.InteropServices.CharSet.Auto)&gt;
        Public Shared Function GetWindowText(ByVal hWnd As IntPtr, ByVal lpString As System.Text.StringBuilder, ByVal nMaxCount As Integer) As Integer
        End Function

        ''' &lt;summary&gt;
        ''' ウィンドウハンドルからプロセスＩＤを取得します。
        ''' &lt;/summary&gt;
        ''' &lt;param name="hWnd"&gt;ウィンドウのハンドル&lt;/param&gt;
        ''' &lt;param name="lpdwProcessId"&gt;プロセスＩＤ&lt;/param&gt;
        ''' &lt;returns&gt;&lt;/returns&gt;
        ''' &lt;remarks&gt;&lt;/remarks&gt;
        &lt;System.Runtime.InteropServices.DllImport("user32.dll")&gt;
        Public Shared Function GetWindowThreadProcessId(ByVal hWnd As IntPtr, &lt;System.Runtime.InteropServices.Out()&gt; ByRef lpdwProcessId As Integer) As Integer
        End Function

        ''' &lt;summary&gt;
        ''' ウィンドウが可視かどうかを調べます。
        ''' &lt;/summary&gt;
        ''' &lt;param name="hWnd"&gt;ウィンドウのハンドル&lt;/param&gt;
        ''' &lt;returns&gt;&lt;/returns&gt;
        ''' &lt;remarks&gt;&lt;/remarks&gt;
        &lt;System.Runtime.InteropServices.DllImport("user32.dll")&gt;
        Public Shared Function IsWindowVisible(ByVal hWnd As IntPtr) As Boolean
        End Function

    End Class

    Sub Main()

        ' ウィンドウの列挙を開始
        Sample.EnumWindows(AddressOf EnumerateWindow, IntPtr.Zero)

        Console.ReadLine()

    End Sub

    ' ウィンドウを列挙するためのコールバックメソッド
    Private Function EnumerateWindow(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As Boolean

        ' ウィンドウが可視かどうか調べる
        If Sample.IsWindowVisible(hWnd) Then
            ' キャプションとプロセスＩＤを表示
            PrintCaptionAndProcess(hWnd)
        End If

        ' ウィンドウの列挙を継続するにはTrueを返す必要がある
        Return True

    End Function

    ' ウィンドウのキャプションとプロセス名を表示する
    Private Sub PrintCaptionAndProcess(ByVal hWnd As IntPtr)

        ' ウィンドウハンドルからプロセスIDを取得
        Dim processId As Integer

        Sample.GetWindowThreadProcessId(hWnd, processId)

        ' プロセスIDからProcessクラスのインスタンスを取得
        Dim p As Process = Process.GetProcessById(processId)

        ' プロセス名を表示
        Console.Write("'{0}' ", p.ProcessName)

        ' ウィンドウのキャプションを取得・表示
        Dim caption As New System.Text.StringBuilder(&amp;H1000)

        Sample.GetWindowText(hWnd, caption, caption.Capacity)

        Console.WriteLine("({0})", caption)

    End Sub

End Module</pre><p>&nbsp;</p><pre class="urvanov-syntax-highlighter-plain-tag">using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;

namespace CS_EnumWindowsTest
{
    class Sample
    {
        /// &lt;summary&gt;
        /// ウィンドウを列挙します。
        /// &lt;/summary&gt;
        /// &lt;param name="lpEnumFunc"&gt;コールバック関数&lt;/param&gt;
        /// &lt;param name="lParam"&gt;アプリケーション定義の値&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern bool EnumWindows(EnumWinProc lpEnumFunc, IntPtr lParam);

        /// &lt;summary&gt;
        /// EnumWindowsから呼び出されるコールバック関数EnumWinProcのデリゲート
        /// &lt;/summary&gt;
        /// &lt;param name="hWnd"&gt;ウィンドウのハンドル&lt;/param&gt;
        /// &lt;param name="lParam"&gt;アプリケーション定義の値&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public delegate bool EnumWinProc(IntPtr hWnd, IntPtr lParam);

        /// &lt;summary&gt;
        /// ウィンドウハンドルからキャプションを取得します
        /// &lt;/summary&gt;
        /// &lt;param name="hWnd"&gt;ウィンドウのハンドル&lt;/param&gt;
        /// &lt;param name="lpString"&gt;キャプション&lt;/param&gt;
        /// &lt;param name="nMaxCount"&gt;キャプションの最大桁数&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

        /// &lt;summary&gt;
        /// ウィンドウハンドルからプロセスＩＤを取得します。
        /// &lt;/summary&gt;
        /// &lt;param name="hWnd"&gt;ウィンドウのハンドル&lt;/param&gt;
        /// &lt;param name="lpdwProcessId"&gt;プロセスＩＤ&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);

        /// &lt;summary&gt;
        /// ウィンドウが可視かどうかを調べます。
        /// &lt;/summary&gt;
        /// &lt;param name="hWnd"&gt;ウィンドウのハンドル&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern bool IsWindowVisible(IntPtr hWnd);
    }

    class Program
    {
        static void Main(string[] args)
        {

            // ウィンドウの列挙を開始
            Sample.EnumWindows(EnumerateWindow, IntPtr.Zero);

            Console.ReadLine();

        }

        private static bool EnumerateWindow(IntPtr hWnd, IntPtr lParam)
        {
            // ウィンドウが可視かどうか調べる
            if (Sample.IsWindowVisible(hWnd))
            {
                // キャプションとプロセスＩＤを表示
                PrintCaptionAndProcess(hWnd);
            }

            // ウィンドウの列挙を継続するにはTrueを返す必要がある
            return true;
        }

        private static void PrintCaptionAndProcess(IntPtr hWnd)
        {
            // ウィンドウハンドルからプロセスIDを取得
            int processId;

            Sample.GetWindowThreadProcessId(hWnd, out processId);

            // プロセスIDからProcessクラスのインスタンスを取得
            Process p = Process.GetProcessById(processId);

            // プロセス名を表示
            Console.Write("'{0}' ", p.ProcessName);

            // ウィンドウのキャプションを取得・表示
            StringBuilder caption = new StringBuilder(0x1000);

            Sample.GetWindowText(hWnd, caption, caption.Capacity);

            Console.WriteLine("({0})", caption);

        }
    }
}</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-179475155"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-4195903901"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/990/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">990</post-id>	</item>
		<item>
		<title>.net(VB、C#)でコンピューター名を取得する</title>
		<link>https://knowledge.reontosanta.com/archives/958</link>
					<comments>https://knowledge.reontosanta.com/archives/958#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Wed, 05 Oct 2016 00:13:44 +0000</pubDate>
				<category><![CDATA[.Net(VB、C#)]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=958</guid>

					<description><![CDATA[.netでプログラムを実行中のコンピューター名を取得するには、以下の&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>.netでプログラムを実行中のコンピューター名を取得するには、以下の方法がある。</p>
<p>&nbsp;</p>
<h2>Environment.MachineName プロパティ</h2>
<p>ローカル コンピュータの NetBIOS 名を取得する。</p>
<p>(NetBIOS名はすべて大文字で、小文字は大文字に自動変換される。)</p>
<p>＜必要条件＞</p>
<p>名前空間: System<br />
アセンブリ: mscorlib (mscorlib.dll 内)</p>
<p>＜構文＞</p><pre class="urvanov-syntax-highlighter-plain-tag">public static string MachineName { get; }</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">'宣言
Public Shared ReadOnly Property MachineName As String
'使用
Dim value As String
value = Environment.MachineName</pre><p>＜解説＞</p>
<p>コンピュータの名前は、システムの起動時に、名前がレジストリから読み込まれた時点で確定される。</p>
<p>コンピュータがクラスタ内のノードである場合は、ノード名が返される。</p>
<p>＜例＞</p>
<p>実行しているコンピュータの名前を表示するコード例を次に示す。</p><pre class="urvanov-syntax-highlighter-plain-tag">using System;
class Sample 
{
  public static void Main() 
  {
    Console.WriteLine();
    Console.WriteLine("MachineName: {0}", Environment.MachineName);
  }
}</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">Imports System
Class Sample
   Public Shared Sub Main()
      Console.WriteLine()
      Console.WriteLine("MachineName: {0}", Environment.MachineName)
   End Sub 'Main
End Class 'Sample</pre><p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-1217986405"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>My.Computer.Name プロパティ(VBのみ)</h2>
<p>コンピュータ名を取得する。</p>
<p>戻り値にコンピュータの名前を格納した String を返す。</p>
<p>＜必要条件＞</p>
<p>名前空間: Microsoft.VisualBasic.Devices<br />
クラス: Computer、ServerComputer<br />
アセンブリ: Visual Basic ランタイム ライブラリ (Microsoft.VisualBasic.dll 内)</p>
<p>＜構文＞</p><pre class="urvanov-syntax-highlighter-plain-tag">'宣言
Public ReadOnly Property Name As String
'使用
Dim value As String = My.Computer.Name</pre><p>＜解説＞</p>
<p>My.Computer.Name プロパティは、MachineName プロパティと同様の機能を提供する。</p>
<p>＜例＞</p>
<p>実行しているコンピュータの名前を表示するコード例を次に示す。</p><pre class="urvanov-syntax-highlighter-plain-tag">MsgBox("Computer name: " &amp; My.Computer.Name)</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-33527020"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-1323713184"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/958/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">958</post-id>	</item>
		<item>
		<title>.Net(VB、C#)のWPFで要素の行・列のサイズを動的に変更する</title>
		<link>https://knowledge.reontosanta.com/archives/697</link>
					<comments>https://knowledge.reontosanta.com/archives/697#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Sun, 13 Dec 2015 23:38:22 +0000</pubDate>
				<category><![CDATA[.Net(VB、C#)]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=697</guid>

					<description><![CDATA[&#60;Grid&#62;要素の行・列のサイズを動的に変更したい場合、&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>&lt;Grid&gt;要素の行・列のサイズを動的に変更したい場合、&lt;Grid&gt;要素の子に&lt;GridSplitter&gt;要素を配置する。</p><pre class="urvanov-syntax-highlighter-plain-tag">&lt;Window x:Class="WPFSample.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="GridSplitter" Height="300" Width="300"&gt;
    &lt;Grid&gt;
        &lt;Grid.RowDefinitions&gt;
            &lt;RowDefinition Height="*" /&gt;
            &lt;RowDefinition Height="auto" /&gt;
            &lt;RowDefinition Height="*" /&gt;
        &lt;/Grid.RowDefinitions&gt;
        &lt;Grid.ColumnDefinitions&gt;
            &lt;ColumnDefinition Width="*" /&gt;
            &lt;ColumnDefinition Width="auto" /&gt;
            &lt;ColumnDefinition Width="*" /&gt;
        &lt;/Grid.ColumnDefinitions&gt;
        &lt;StackPanel Background="#ffcccc" /&gt;
        &lt;StackPanel Background="#ccffcc" Grid.Column="2"/&gt;
        &lt;StackPanel Background="#ccccff" Grid.Row="2" /&gt;
        &lt;StackPanel Background="#ccffff" Grid.Row="2" Grid.Column="2"/&gt;
        &lt;GridSplitter Grid.Row="1" Grid.ColumnSpan="3" Height="5" HorizontalAlignment="Stretch" /&gt;
        &lt;GridSplitter Grid.Column="1" Grid.RowSpan="3" Width="5" HorizontalAlignment="Stretch" /&gt;
    &lt;/Grid&gt;
&lt;/Window&gt;</pre><p>尚、&lt;GridSplitter&gt;要素を利用する場合、以下のような注意点がある。</p>
<p>&lt;GridSplitter&gt;要素自体、&lt;Grid&gt;要素のセルを1つ占有する為、&lt;GridSplitter&gt;要素を配置するための行・列を「auto」指定で作成しておく必要がある。</p>
<p>&lt;GridSplitter&gt;要素は、デフォルトの状態では幅も高さも「0」で不可視となる為、見えるサイズに調整する必要がある。<br />
（HorizontalAlignment属性に「Stretch」を指定して、上下分割の場合はGrid.ColumnSpanとHeight、左右分割の場合はGrid.RowSpanとWidthにそれぞれ値を指定する）</p>
<p>「特定の1行だけ列幅を変えたい」というようなことは1つの&lt;Grid&gt;要素内では行えない為、&lt;Grid&gt;要素を入れ子にして内側の&lt;Grid&gt;要素だけに&lt;GridSplitter&gt;要素を追加するなどの工夫が必要になる。</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-1323063446"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-3594048782"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/697/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">697</post-id>	</item>
		<item>
		<title>.Net(VB、C#)のWPFでマウスホイールに連動してフォントサイズを変更する</title>
		<link>https://knowledge.reontosanta.com/archives/693</link>
					<comments>https://knowledge.reontosanta.com/archives/693#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Mon, 07 Dec 2015 00:36:59 +0000</pubDate>
				<category><![CDATA[.Net(VB、C#)]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=693</guid>

					<description><![CDATA[[Control]キーが押された状態でのマウスホイールの回転に連動し&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>[Control]キーが押された状態でのマウスホイールの回転に連動してフォントサイズを変更する。</p>
<p>また、フォントサイズに連動したグリッドの動きを確認する。</p><pre class="urvanov-syntax-highlighter-plain-tag">&lt;Window x:Class="WPFSample.Window1"
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	Title="Grid" FontSize="16" Height="320" Width="480"&gt;
	&lt;Grid&gt;
		&lt;Grid.RowDefinitions&gt;
			&lt;RowDefinition Height="*" /&gt;
			&lt;RowDefinition Height="*" /&gt;
			&lt;RowDefinition Height="*" /&gt;
		&lt;/Grid.RowDefinitions&gt;

		&lt;Grid&gt;
			&lt;Grid.RowDefinitions&gt;
				&lt;RowDefinition Height="50" /&gt;
				&lt;RowDefinition Height="50" /&gt;
			&lt;/Grid.RowDefinitions&gt;
			&lt;Grid.ColumnDefinitions&gt;
				&lt;ColumnDefinition Width="150" /&gt;
				&lt;ColumnDefinition Width="150" /&gt;
				&lt;ColumnDefinition Width="150" /&gt;
			&lt;/Grid.ColumnDefinitions&gt;
			&lt;Button Content="固定幅" Background="#ffcccc" /&gt;
			&lt;Button Content="A" Background="#ccffcc" Grid.Column="1" /&gt;
			&lt;Button Content="B" Background="#ccccff" Grid.Column="2" /&gt;
			&lt;Button Content="190" Background="#ccffff" Grid.Row="1" /&gt;
			&lt;Button Content="190" Background="#ffccff" Grid.Row="1" Grid.Column="1" /&gt;
			&lt;Button Content="190" Background="#ffffcc" Grid.Row="1" Grid.Column="2" /&gt;
		&lt;/Grid&gt;

		&lt;Grid Grid.Row="1"&gt;
			&lt;Grid.RowDefinitions&gt;
				&lt;RowDefinition Height="*" /&gt;
				&lt;RowDefinition Height="*" /&gt;
			&lt;/Grid.RowDefinitions&gt;
			&lt;Grid.ColumnDefinitions&gt;
				&lt;ColumnDefinition Width="2*" /&gt;
				&lt;ColumnDefinition Width="3*" /&gt;
				&lt;ColumnDefinition Width="4*" /&gt;
			&lt;/Grid.ColumnDefinitions&gt;
			&lt;Button Content="比率" Background="#ffcccc" /&gt;
			&lt;Button Content="A" Background="#ccffcc" Grid.Column="1" /&gt;
			&lt;Button Content="B" Background="#ccccff" Grid.Column="2" /&gt;
			&lt;Button Content="2*" Background="#ccffff" Grid.Row="1" /&gt;
			&lt;Button Content="3*" Background="#ffccff" Grid.Row="1" Grid.Column="1" /&gt;
			&lt;Button Content="4*" Background="#ffffcc" Grid.Row="1" Grid.Column="2" /&gt;
		&lt;/Grid&gt;

		&lt;Grid Grid.Row="2"&gt;
			&lt;Grid.RowDefinitions&gt;
				&lt;RowDefinition Height="auto" /&gt;
				&lt;RowDefinition Height="auto" /&gt;
			&lt;/Grid.RowDefinitions&gt;
			&lt;Grid.ColumnDefinitions&gt;
				&lt;ColumnDefinition Width="auto" /&gt;
				&lt;ColumnDefinition Width="auto" /&gt;
				&lt;ColumnDefinition Width="auto" /&gt;
			&lt;/Grid.ColumnDefinitions&gt;
			&lt;Button Content="自動" Background="#ffcccc" /&gt;
			&lt;Button Content="━━━長いテキスト━━━" Background="#ccffcc" Grid.Column="1" /&gt;
			&lt;Button Content="短い" Background="#ccccff" Grid.Column="2" /&gt;
			&lt;Button Content="auto" Background="#ccffff" Grid.Row="1" /&gt;
			&lt;Button Content="短い" Background="#ffccff" Grid.Row="1" Grid.Column="1" /&gt;
			&lt;Button Content="━━━長いテキスト━━━" Background="#ffffcc" Grid.Row="1" Grid.Column="2" /&gt;
		&lt;/Grid&gt;
	&lt;/Grid&gt;
&lt;/Window&gt;</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">Namespace WPFSample
	Class Window1
		Public Sub New()

			' この呼び出しは、Windows フォーム デザイナで必要です。
			InitializeComponent()

			' InitializeComponent() 呼び出しの後で初期化を追加します。

		End Sub

		Protected Overrides Sub OnMouseWheel(ByVal e As System.Windows.Input.MouseWheelEventArgs)
			' Controlキーの入力判定
			If (Keyboard.Modifiers And ModifierKeys.Control) &lt;&gt; ModifierKeys.None Then
				' Controlキーの入力がある場合
				' ホイールの回転方向判定
				If e.Delta &gt; 0 Then
					' ホイールを上方向に回転
					' フォントサイズが200未満の場合、フォントサイズを増加
					If Me.FontSize &lt; 200 Then
						Me.FontSize += 1
					End If
				Else
					' ホイールを下方向に回転
					' フォントサイズが1より大きい場合、フォントサイズを減少
					If Me.FontSize &gt; 1 Then
						Me.FontSize -= 1
					End If
				End If
			End If
			MyBase.OnMouseWheel(e)
		End Sub
	End Class
End Namespace</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WPFSample
{
	/// &lt;summary&gt;
	/// Window1.xaml の相互作用ロジック
	/// &lt;/summary&gt;
	public partial class Window1 : Window
	{
		public Window1()
		{
			InitializeComponent();
		}

		protected override void OnMouseWheel(MouseWheelEventArgs e)
		{
			// Controlキーの入力判定
			if ((Keyboard.Modifiers &amp; ModifierKeys.Control) != ModifierKeys.None)
			{
				// Controlキーの入力がある場合
				// ホイールの回転方向判定
				if (e.Delta &gt; 0)
				{
					// ホイールを上方向に回転
					// フォントサイズが200未満の場合、フォントサイズを増加
					if (this.FontSize &lt; 200)
					{
						this.FontSize++;
					}
				}
				else
				{
					// ホイールを下方向に回転
					// フォントサイズが1より大きい場合、フォントサイズを減少
					if (this.FontSize &gt; 1)
					{
						this.FontSize--;
					}
				}
			}
			base.OnMouseWheel(e);
		}
	}
}</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-1836652158"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-259393655"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/693/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">693</post-id>	</item>
		<item>
		<title>.NetのWPFにおけるテキスト入力UI要素</title>
		<link>https://knowledge.reontosanta.com/archives/687</link>
					<comments>https://knowledge.reontosanta.com/archives/687#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Mon, 30 Nov 2015 23:28:27 +0000</pubDate>
				<category><![CDATA[.Net(VB、C#)]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=687</guid>

					<description><![CDATA[文字列の選択 &#60;TextBox&#62;要素および&#60;Ric&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<h2>文字列の選択</h2>
<p>&lt;TextBox&gt;要素および&lt;RichTextBox&gt;要素では、テキストボックス内で選択されている文字列に関する情報を、SelectionStartプロパティ、SelectionLengthプロパティ、および、SelectedTextプロパティを通して取得できる。</p>
<p>尚、AutoWordSelectionプロパティに「true」を設定することで、マウスでドラッグした際に単語単位で文字列選択されるよう、選択範囲が自動調整されるようになる。</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-3633492458"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>複数行のテキスト</h2>
<p>&lt;TextBox&gt;要素内で複数行のテキストを表示したい場合には、TextWrappingプロパティに「Wrap」を設定する。</p>
<p>複数行テキストを表示する際、MinLinesプロパティおよびMaxLinesプロパティを設定しておくと、実際の行数が変わる場合にも表示上のサイズを固定することができる。</p>
<p>また、［Enter］キーで改行を入力したい場合には、AcceptsReturnプロパティに「true」を設定する。</p>
<h2>スペルチェック</h2>
<p>その他、WPFにはスペルチェック機能があり、&lt;TextBox&gt;要素や&lt;RichTextBox&gt;要素のSpellCheck.IsEnabled添付プロパティに「true」を設定することで、スペルチェックが働くようになる。</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-4282854633"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-1409704617"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/687/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">687</post-id>	</item>
		<item>
		<title>.NetのWPFにおけるボタンUI要素</title>
		<link>https://knowledge.reontosanta.com/archives/689</link>
					<comments>https://knowledge.reontosanta.com/archives/689#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Mon, 30 Nov 2015 23:27:57 +0000</pubDate>
				<category><![CDATA[.Net(VB、C#)]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=689</guid>

					<description><![CDATA[ButtonBaseクラス ButtonBaseクラスのClickM&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<h2>ButtonBaseクラス</h2>
<p>ButtonBaseクラスのClickModeプロパティを設定することで、Clickイベントが発生するタイミングを「Release」（＝ボタンを押して離したとき）、「Press」（＝ボタンを押したとき）、「Hover」（＝ボタンの上にマウス・カーソルを載せたとき）の3つの中から選べる。</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-3315720596"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>Buttonクラス</h2>
<p>Buttonクラスでは、IsDefaultプロパティに「true」を設定することで、デフォルトボタン（＝WindowsフォームでのAcceptButton。［Enter］キーを押したときにClickイベントが発生する）に、IsCancelプロパティに「true」を設定することでキャンセルボタン（＝同、CancelButton。［Escape］キーを押したときにClickイベントが発生する）にすることができる。</p>
<h2>ToggleButtonクラス</h2>
<p>ToggleButtonクラス（System.Windows.Controls.Primitives名前空間）は、オン／オフの2つの状態を表すクラスであるが、IsThreeStateプロパティがtrueの場合、オン／オフ／未設定の3つの状態（＝IsCheckedプロパティがfalseのときとnullのときで異なる表示が行われる）を表すことも可能である。</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-918359818"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-2209905356"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/689/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">689</post-id>	</item>
		<item>
		<title>.Net(VB、C#)のWPFで半透明ウィンドウを作る</title>
		<link>https://knowledge.reontosanta.com/archives/691</link>
					<comments>https://knowledge.reontosanta.com/archives/691#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Sun, 08 Nov 2015 23:36:25 +0000</pubDate>
				<category><![CDATA[.Net(VB、C#)]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=691</guid>

					<description><![CDATA[枠線なし、リサイズ可能、半透明のウィンドウを作る。 [crayon-&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>枠線なし、リサイズ可能、半透明のウィンドウを作る。</p><pre class="urvanov-syntax-highlighter-plain-tag">&lt;Window x:Class="WPFSample.Window1"
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	WindowStyle="None"
	ResizeMode="CanResizeWithGrip"
	AllowsTransparency="True"
	Background="#80808080"
	SizeToContent="WidthAndHeight"&gt;
	&lt;Grid&gt;
		&lt;TextBlock FontSize="50"&gt;半透明ウィンドウ&lt;/TextBlock&gt;
	&lt;/Grid&gt;
&lt;/Window&gt;</pre><p>このようなウィンドウを作った場合、タイトルバーが存在しないため、そのままではドラッグによるウィンドウの移動ができない。</p>
<p>ウィンドウの移動を可能にしたい場合は、マウスクリックイベントのハンドラにDragMoveメソッドを呼び出すコードを記述する。</p>
<p>また、キー入力イベントのハンドラにCloseメソッドを呼び出すコードを記述すれば、任意のキーが入力された時にウィンドウを閉じるようにできる。</p><pre class="urvanov-syntax-highlighter-plain-tag">Namespace WPFSample
	Class Window1
		Public Sub New()

			' この呼び出しは、Windows フォーム デザイナで必要です。
			InitializeComponent()

			' InitializeComponent() 呼び出しの後で初期化を追加します。
			'' マウスクリックイベントのハンドラにDragMoveメソッドを追加
			AddHandler Me.MouseLeftButtonDown, AddressOf MouseLeftButton_Down
			'' キー入力イベントのハンドラにCloseメソッドを追加
			AddHandler Me.KeyDown, AddressOf Key_Down

		End Sub

		Private Sub MouseLeftButton_Down(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
			Me.DragMove()
		End Sub

		Private Sub Key_Down(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
			Me.Close()
		End Sub
	End Class
End Namespace</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WPFSample
{
	/// &lt;summary&gt;
	/// Window1.xaml の相互作用ロジック
	/// &lt;/summary&gt;
	public partial class Window1 : Window
	{
		public Window1()
		{
			InitializeComponent();
			// マウスクリックイベントのハンドラにDragMoveメソッドを追加
			this.MouseLeftButtonDown += (sender, e) =&gt; { this.DragMove(); };
			// キー入力イベントのハンドラにCloseメソッドを追加
			this.KeyDown += (sender, e) =&gt; { this.Close(); };
		}
	}
}</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-3216250962"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-789185141"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/691/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">691</post-id>	</item>
		<item>
		<title>.Net(VB、C#)でLinq to XMLを利用してXMLを操作する</title>
		<link>https://knowledge.reontosanta.com/archives/677</link>
					<comments>https://knowledge.reontosanta.com/archives/677#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Mon, 03 Aug 2015 03:57:33 +0000</pubDate>
				<category><![CDATA[.Net(VB、C#)]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=677</guid>

					<description><![CDATA[XMLドキュメントを簡単かつ効率的に作成・参照・更新できるようにする&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>XMLドキュメントを簡単かつ効率的に作成・参照・更新できるようにするLinq to XMLを利用してXMLファイルを操作する。</p>
<p>&nbsp;</p>
<h2>using句の指定（C#の場合）</h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">using System.Xml.Linq;</pre><p>using句でLinq to XMLの名前空間を呼出しておく。</p>
<p>尚、Visual Studioのソリューションエクスプローラで参照設定を確認し、System.XML.Linqの参照設定がない場合には追加する。</p>
<p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-4020581050"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>単純なXMLの表示</h2>
<p>簡単なXMLのデータを作成し、コンソールに表示する。</p><pre class="urvanov-syntax-highlighter-plain-tag">Dim x = New XElement("Name", "Jyunpei Ryuzouji")
Console.WriteLine(x)</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">var x = new XElement("Name", "Jyunpei Ryuzouji");
Console.WriteLine(x);</pre><p>Nameという1種類の要素を持つXMLデータを作成し、コンソールに表示している。</p>
<p>Linq to XMLにおいて、XElementクラスがXML要素を表すクラスになる。</p>
<p>尚、Linq to XMLの各クラスは先頭に&#8221;X&#8221;がつく。</p><pre class="urvanov-syntax-highlighter-plain-tag">&lt;Name&gt;Jyunpei Ryuzouji&lt;/Name&gt;</pre><p>&nbsp;</p>
<h2>XML要素に属性を追加して表示</h2>
<p>XML要素に属性(Attribute)を追加する。</p><pre class="urvanov-syntax-highlighter-plain-tag">Dim x = New XElement("Name", New XAttribute("ID", 99999), "Jyunpei Ryuzouji")
Console.WriteLine(x)</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">var x = new XElement("Name", new XAttribute("ID", 99999), "Jyunpei Ryuzouji");
Console.WriteLine(x);</pre><p>XElementクラスのコンストラクタの中でXAttributeクラスを初期化し、IDという属性とその値として&#8221;99999&#8243;を追加する。</p><pre class="urvanov-syntax-highlighter-plain-tag">&lt;Name ID="99999"&gt;Tadahiro Ishisaka&lt;/Name&gt;</pre><p>Name要素にID属性が追加され、その値が&#8221;99999&#8243;となっている。</p>
<p>&nbsp;</p>
<h2>XElementクラスのAddメソッドを使用して属性を追加</h2>
<p>XElementクラスのAddメソッドを使用して、XML要素に属性(Attribute)を追加する。</p><pre class="urvanov-syntax-highlighter-plain-tag">Dim x = New XElement("Name", "Jyunpei Ryuzouji")
x.Add(New XAttribute("ID", 99999))
Console.WriteLine(x)</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">var x = new XElement("Name", "Jyunpei Ryuzouji");
x.Add(new XAttribute("ID", 99999));
Console.WriteLine(x);</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">&lt;Name ID="99999"&gt;Tadahiro Ishisaka&lt;/Name&gt;</pre><p>&nbsp;</p>
<h2>XML文書を作成する</h2>
<p>Linq to XMLでXML文書(XML Document)を表すクラスはXDocumentクラスになる。</p><pre class="urvanov-syntax-highlighter-plain-tag">'XML文書の作成
Dim Users = New XDocument( _
    New XDeclaration("1.0", "utf-8", "yes"), _
    New XElement( _
        "Users", _
        New XElement( _
            "User", _
            New XAttribute("ID", 99999), _
            New XElement("Name", "Jyunpei Ryuzouji"), _
            New XElement("Address", "Shizuoka") _
        ), _
        New XElement( _
            "User", _
            New XAttribute("ID", 88888), _
            New XElement("Name", "Rituko Inoue"), _
            New XElement("Address", "Fukuoka") _
        ) _
    ) _
)
'出力
Console.WriteLine(Users.Declaration)
Console.WriteLine(Users)</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">//XML文書の作成
var Users = new XDocument(
   new XDeclaration("1.0", "utf-8", "yes"),
   new XElement(
        "Users",
        new XElement(
            "User",
            new XAttribute("ID", 99999),
            new XElement("Name", "Jyunpei Ryuzouji"),
            new XElement("Address", "Shizuoka")
        ),
        new XElement(
            "User",
            new XAttribute("ID", 88888),
            new XElement("Name", "Rituko Inoue"),
            new XElement("Address", "Fukuoka")
        )
   )
);
//出力
Console.WriteLine(Users.Declaration);
Console.WriteLine(Users);</pre><p>上記はXDocumentクラスのコンストラクタですべてを記述している。</p>
<p>この程度であれば問題ないが、これ以上大きなXML文書を扱うには視認性が悪い。</p>
<p>尚、途中に出てくるXDeclarationクラスはXML宣言のクラス。</p><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?xml version="1.0" encoding="utf-8" standalone="yes"?&gt;
&lt;Users&gt;
    &lt;User ID="99999"&gt;
        &lt;Name&gt;Jyunpei Ryuzouji&lt;/Name&gt;
        &lt;Address&gt;Shizuoka&lt;/Address&gt;
    &lt;/User&gt;
    &lt;User ID="88888"&gt;
        &lt;Name&gt;Rituko Inoue&lt;/Name&gt;
        &lt;Address&gt;Fukuoka&lt;/Address&gt;
    &lt;/User&gt;
&lt;/Users&gt;</pre><p>&nbsp;</p>
<h2>XML文書を作成する（ノードごとに記述）</h2>
<p>コードの視認性を良くする為にノードごとにXML要素を追加する。</p><pre class="urvanov-syntax-highlighter-plain-tag">'XML文書の作成
Dim Users = New XDocument(New XDeclaration("1.0", "utf-8", "yes"))
Users.Add(New XComment("ユーザリスト")) 'XMLコメントの追加
Users.Add(New XElement("Users")) 'Root Elementの作成
'1ノード目の追加
Dim temp = New XElement("User")
temp.Add(New XAttribute("ID", 99999))
temp.Add(New XElement("Name", "Jyunpei Ryuzouji"))
temp.Add(New XElement("Address", "Shizuoka"))
Users.Root.Add(temp)
'2ノード目の追加
temp = New XElement("User")
temp.Add(New XAttribute("ID", 88888))
temp.Add(New XElement("Name", "Rituko Inoue"))
temp.Add(New XElement("Address", "Fukuoka"))
Users.Root.Add(temp)
'3ノード目の追加
temp = New XElement("User")
temp.Add(New XAttribute("ID", 77777))
temp.Add(New XElement("Name", "Airi Komiyama"))
temp.Add(New XElement("Address", "Tokyo"))
Users.Root.Add(temp)
'出力
Console.WriteLine(Users.Declaration)
Console.WriteLine(Users)</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">//XML文書の作成
var Users = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
Users.Add(new XComment("ユーザリスト")); //XMLコメントの追加
Users.Add(new XElement("Users")); //Root Elementの作成
//1ノード目の追加
var temp = new XElement("User");
temp.Add(new XAttribute("ID", 99999));
temp.Add(new XElement("Name", "Jyunpei Ryuzouji"));
temp.Add(new XElement("Address", "Shizuoka"));
Users.Root.Add(temp);
//2ノード目の追加
temp = new XElement("User");
temp.Add(new XAttribute("ID", 88888));
temp.Add(new XElement("Name", "Rituko Inoue"));
temp.Add(new XElement("Address", "Fukuoka"));
Users.Root.Add(temp);
//3ノード目の追加
temp = new XElement("User");
temp.Add(new XAttribute("ID", 77777));
temp.Add(new XElement("Name", "Airi Komiyama"));
temp.Add(new XElement("Address", "Tokyo"));
Users.Root.Add(temp);
//出力
Console.WriteLine(Users.Declaration);
Console.WriteLine(Users);</pre><p>XML宣言を表すXDeclarationクラスのインスタンスはXDocumentクラスのコンストラクタの引数に渡す必要がある。</p>
<p>後からXDocumentクラスのAddメソッドで追加することは出来ない。(実行時エラーとなる)</p>
<p>また、XCommentクラスを使用するとXMLコメントを追加することが出来る。</p><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?xml version="1.0" encoding="utf-8" standalone="yes"?&gt;
&lt;!--ユーザリスト--&gt;
&lt;Users&gt;
    &lt;User ID="99999"&gt;
        &lt;Name&gt;Jyunpei Ryuzouji&lt;/Name&gt;
        &lt;Address&gt;Shizuoka&lt;/Address&gt;
    &lt;/User&gt;
    &lt;User ID="88888"&gt;
        &lt;Name&gt;Rituko Inoue&lt;/Name&gt;
        &lt;Address&gt;Fukuoka&lt;/Address&gt;
    &lt;/User&gt;
    &lt;User ID="77777"&gt;
        &lt;Name&gt;Airi Komiyama&lt;/Name&gt;
        &lt;Address&gt;Tokyo&lt;/Address&gt;
    &lt;/User&gt;
&lt;/Users&gt;</pre><p>&nbsp;</p>
<h2>XML文書の保存</h2>
<p>XML文書を保存するにはXDocumentクラスのSaveメソッドを使用する。</p><pre class="urvanov-syntax-highlighter-plain-tag">'XML文書の保存
Users.Save(System.AppDomain.CurrentDomain.BaseDirectory + "Users.xml")</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">//XML文書の保存
Users.Save(System.AppDomain.CurrentDomain.BaseDirectory + "Users.xml");</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?xml version="1.0" encoding="utf-8" standalone="yes"?&gt;
&lt;!--ユーザリスト--&gt;
&lt;Users&gt;
    &lt;User ID="99999"&gt;
        &lt;Name&gt;Jyunpei Ryuzouji&lt;/Name&gt;
        &lt;Address&gt;Shizuoka&lt;/Address&gt;
    &lt;/User&gt;
    &lt;User ID="88888"&gt;
        &lt;Name&gt;Rituko Inoue&lt;/Name&gt;
        &lt;Address&gt;Fukuoka&lt;/Address&gt;
    &lt;/User&gt;
    &lt;User ID="77777"&gt;
        &lt;Name&gt;Airi Komiyama&lt;/Name&gt;
        &lt;Address&gt;Tokyo&lt;/Address&gt;
    &lt;/User&gt;
&lt;/Users&gt;</pre><p>上記の他にXMLWriterに渡して非同期で出力する方法、TextWriterに渡して同じく非同期で出力する方法、出力時に空白を削除する／しないのオプションがある。</p>
<p>&nbsp;</p>
<h2>XMLファイルの読込み</h2>
<p>XMLファイルからデータを読込むには、XDocumentクラスのLoadメソッドを使用する。</p><pre class="urvanov-syntax-highlighter-plain-tag">'XML文書の読込み
Console.WriteLine("XMLファイルを読込む")
Dim ReadedUsers = XDocument.Load(System.AppDomain.CurrentDomain.BaseDirectory + "Users.xml")
Console.WriteLine(ReadedUsers.Declaration)
Console.WriteLine(ReadedUsers)</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">//XML文書の読込み
Console.WriteLine("XMLファイルを読込む");
var ReadedUsers = XDocument.Load(System.AppDomain.CurrentDomain.BaseDirectory + "Users.xml");
Console.WriteLine(ReadedUsers.Declaration);
Console.WriteLine(ReadedUsers);</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?xml version="1.0" encoding="utf-8" standalone="yes"?&gt;
&lt;!--ユーザリスト--&gt;
&lt;Users&gt;
    &lt;User ID="99999"&gt;
        &lt;Name&gt;Jyunpei Ryuzouji&lt;/Name&gt;
        &lt;Address&gt;Shizuoka&lt;/Address&gt;
    &lt;/User&gt;
    &lt;User ID="88888"&gt;
        &lt;Name&gt;Rituko Inoue&lt;/Name&gt;
        &lt;Address&gt;Fukuoka&lt;/Address&gt;
    &lt;/User&gt;
    &lt;User ID="77777"&gt;
        &lt;Name&gt;Airi Komiyama&lt;/Name&gt;
        &lt;Address&gt;Tokyo&lt;/Address&gt;
    &lt;/User&gt;
&lt;/Users&gt;</pre><p>LoadメソッドもSaveメソッドと同様にオーバーロードされたメソッドがあり、URI指定によるXMLファイルの読込みやXMLReader、TextReaderからの読込みがサポートされている。</p>
<p>&nbsp;</p>
<h2>クエリ式を使用したLINQの記述</h2>
<p>Linq to XMLなので勿論、LINQによるXML要素の取得が可能。</p>
<p>LINQの基本的なクエリ式は、以下の通り。</p><pre class="urvanov-syntax-highlighter-plain-tag">from [範囲変数] in [データソース]
select [範囲変数]</pre><p>クエリ式はまず、from句から始める必要がある。</p>
<p>次に最低でもselect句で範囲変数を指定し、最終的に式が返すソースシーケンスの内容を確定する。</p>
<p>from句<br />
from [範囲変数] in [データソース]</p>
<p>from句ではクエリもしくはサブクエリの対象となるデータソースとソースシーケンス内の各要素を表すローカルの範囲変数を指定する。</p>
<p>尚、ソースシーケンスとはデータソースの中でクエリ式内での各操作の対象となる連続したデータのこと。</p>
<p>LINQのデータソースにはIEnumerable&lt;T&gt;インターフェイスあるいはIEnumerableとその派生インターフェイスを実装したオブジェクトだけを指定することができる。</p>
<p>通常の配列やArrayList、ADO.NETのデータセットはIEnumerableインターフェイスを持つ為、LINQの対象とすることができる。</p>
<p>selsct句<br />
select [式]</p>
<p>selsct句はクエリ式が実行されたときに生成される値の型を指定する。</p>
<p>クエリ式の結果はselect句の前の式の評価およびselect句の式の評価によって生成される。</p>
<p>select句の一番単純な例は式に範囲変数を指定し、ソースシーケンスをそのまま式の値とする方法。</p>
<p>where句<br />
whewe [条件式]</p>
<p>where句を利用することで、ソースシーケンスのデータに対して何らかのフィルタリング条件を付けて必要なデータだけを取得することが出来る。</p><pre class="urvanov-syntax-highlighter-plain-tag">'XML文書の読込み
Console.WriteLine("XMLファイルを読込む")
Dim ReadedUsers = XDocument.Load(System.AppDomain.CurrentDomain.BaseDirectory + "Users.xml")
Console.WriteLine(ReadedUsers.Declaration)
Console.WriteLine(ReadedUsers)
'クエリ式の発行
Console.WriteLine("クエリ式を発行して値を取得")
Dim query = _
    From x In ReadedUsers.Descendants("User") _
    Where x.Attribute("ID").Value = "88888" _
    Select x
'出力
For Each i In query
    Console.WriteLine(i.Attribute("ID").Value + " : " + i.Element("Name").Value + " : " + i.Element("Address").Value)
Next</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">//XML文書の読込み
Console.WriteLine("XMLファイルを読込む");
var ReadedUsers = XDocument.Load(System.AppDomain.CurrentDomain.BaseDirectory + "Users.xml");
Console.WriteLine(ReadedUsers.Declaration);
Console.WriteLine(ReadedUsers);
//クエリ式の発行
Console.WriteLine("クエリ式を発行して値を取得");
var query =
    from x in ReadedUsers.Descendants("User")
    where x.Attribute("ID").Value == "88888"
    select x;
//出力
foreach (var i in query)
{
    Console.WriteLine(i.Attribute("ID").Value + " : " + i.Element("Name").Value + " : " + i.Element("Address").Value);
}</pre><p>通常、特定の要素を検索対象とするには正確に木構造を辿る形で指定していく必要がある。</p>
<p>しかし、Linq to XMLではDescendantsで要素名を指定すれば木構造を辿らずダイレクトに指定する事が出来る。</p>
<p>上記は、ID属性が&#8221;88888&#8243;のユーザ情報をコンソールに表示している。</p><pre class="urvanov-syntax-highlighter-plain-tag">XMLファイルを読込む
&lt;?xml version="1.0" encoding="utf-8" standalone="yes"?&gt;
&lt;!--ユーザリスト--&gt;
&lt;Users&gt;
    &lt;User ID="99999"&gt;
        &lt;Name&gt;Jyunpei Ryuzouji&lt;/Name&gt;
        &lt;Address&gt;Shizuoka&lt;/Address&gt;
    &lt;/User&gt;
    &lt;User ID="88888"&gt;
        &lt;Name&gt;Rituko Inoue&lt;/Name&gt;
        &lt;Address&gt;Fukuoka&lt;/Address&gt;
    &lt;/User&gt;
    &lt;User ID="77777"&gt;
        &lt;Name&gt;Airi Komiyama&lt;/Name&gt;
        &lt;Address&gt;Tokyo&lt;/Address&gt;
    &lt;/User&gt;
&lt;/Users&gt;
クエリ式を発行して値を取得
88888 : Rituko Inoue : Fukuoka</pre><p>&nbsp;</p>
<h2>メソッドベースでのLINQの記述</h2>
<p>メソッドベースでもLINQの記述が可能。</p><pre class="urvanov-syntax-highlighter-plain-tag">'XML文書の読込み
Console.WriteLine("XMLファイルを読込む")
Dim ReadedUsers = XDocument.Load(System.AppDomain.CurrentDomain.BaseDirectory + "Users.xml")
Console.WriteLine(ReadedUsers.Declaration)
Console.WriteLine(ReadedUsers)
'メソッドベース（ラムダ式）でLINQを記述
Console.WriteLine("メソッドベース（ラムダ式）で値を取得")
Dim lambda = ReadedUsers.Descendants("User").Where(Function(x) x.Attribute("ID").Value = "99999")
For Each i In lambda
    Console.WriteLine(i.Attribute("ID").Value + " : " + i.Element("Name").Value + " : " + i.Element("Address").Value)
Next</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">//XML文書の読込み
Console.WriteLine("XMLファイルを読込む");
var ReadedUsers = XDocument.Load(System.AppDomain.CurrentDomain.BaseDirectory + "Users.xml");
Console.WriteLine(ReadedUsers.Declaration);
Console.WriteLine(ReadedUsers);
//メソッドベース（ラムダ式）でLINQを記述
Console.WriteLine("メソッドベース（ラムダ式）で値を取得");
var lambda = ReadedUsers.Descendants("User").Where(x =&gt; x.Attribute("ID").Value == "99999");
//出力
foreach (var i in lambda)
{
    Console.WriteLine(i.Attribute("ID").Value + " : " + i.Element("Name").Value + " : " + i.Element("Address").Value);
}</pre><p>上記は、ID属性が&#8221;99999&#8243;のユーザ情報をコンソールに表示している。</p><pre class="urvanov-syntax-highlighter-plain-tag">XMLファイルを読込む
&lt;?xml version="1.0" encoding="utf-8" standalone="yes"?&gt;
&lt;!--ユーザリスト--&gt;
&lt;Users&gt;
    &lt;User ID="99999"&gt;
        &lt;Name&gt;Jyunpei Ryuzouji&lt;/Name&gt;
        &lt;Address&gt;Shizuoka&lt;/Address&gt;
    &lt;/User&gt;
    &lt;User ID="88888"&gt;
        &lt;Name&gt;Rituko Inoue&lt;/Name&gt;
        &lt;Address&gt;Fukuoka&lt;/Address&gt;
    &lt;/User&gt;
    &lt;User ID="77777"&gt;
        &lt;Name&gt;Airi Komiyama&lt;/Name&gt;
        &lt;Address&gt;Tokyo&lt;/Address&gt;
    &lt;/User&gt;
&lt;/Users&gt;
メソッドベース（ラムダ式）で値を取得
99999 : Jyunpei Ryuzouji : Shizuoka</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-2713271877"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-1211434967"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/677/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">677</post-id>	</item>
	</channel>
</rss>
