.NET C# - How to check if all leaves are in WinForms TreeView.

You could easily make this into an extension methods like this.

public static class ExtensionMethods
{
    public static bool AllLeavesChecked(this TreeNode treeNode)
    {
        if (treeNode.Nodes.Count == 0)
        {
            return treeNode.Checked;
        }
        else
        {
            bool returns = true;
            foreach (TreeNode node in treeNode.Nodes)
            {
                returns &= node.AllLeavesChecked();
            }

            return returns;
        }
    }
}

【C#】【VB.NET】Listや配列を1行のLinqクエリで列挙する

Listや配列を簡潔に列挙する手法をノートします

参考サイト
stackoverflow.com

C#の場合

class Student
{
    public int Code;
    public string Name;
    public Student(int p1, string p2)
    {
        Code = p1;
        Name = p2;
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 整数配列を列挙する
        int[] array = new int[] { 1, 3, 5 };
        array.ToList().ForEach(x => Console.WriteLine(x));

        // StudentクラスListを列挙する
        List<Student> students = new List<Student>();
        students.Add(new Student(1, "Alice "));
        students.Add(new Student(2, "Bod"));
        students.ForEach(x => Console.WriteLine(x.Code + ": " + x.Name));
    }
}

VB.NETの場合

Class Stundent
    Public No As Integer
    Public Name As String
    Sub New(p1 As Integer, p2 As String)
        No = p1
        Name = p2
    End Sub
End Class

Sub Main(args As String())
    ' 整数配列を列挙する
    Dim array As Integer() = {1, 3, 5}
    array.ToList().ForEach(Sub(x) Console.WriteLine(x))

    ' StudentクラスListを列挙する
    Dim students As New List(Of Stundent)
    students.Add(New Stundent(1, "Alice"))
    students.Add(New Stundent(2, "Bob"))
    students.ForEach(Sub(x) Console.WriteLine(x.No & ": " & x.Name))

    Console.ReadKey()
End Sub

結果
f:id:ktts:20200123211415p:plain

【cmd】treeコマンドで特定の拡張子のみ出力する

Windowsにおけるtreeコマンドで特定の拡張子のみ出力する手法を調べたのでノートします。
下記のフォルダ構造でtxtファイルのみを出力します。

f:id:ktts:20191218003911p:plain

tree /f /a | findstr /ri /c:"^[^| ]" /c:"^[| ]*[+\\]" /c:"\.txt$"

f:id:ktts:20191218004012p:plain

参考サイト
stackoverflow.com

【C#】【VB.NET】StreamReaderでスキップして1行先を読み込む方法

CSVを読み込むときに、ループの現在行を変えずに次の行をカンニングしたいケースがあります。
StreamReaderはランダムアクセスできないものですが、継承クラスを利用することで可能だったのでメモします。
この力、マリアンヌ様以外に使うことがあろうとはな!!

参考サイト
stackoverflow.com

C#の場合

using System.IO;

public class PositionableStreamReader : StreamReader
{
    public PositionableStreamReader(string path)
        : base(path)
    { }

    private int myLineEndingCharacterLength = Environment.NewLine.Length;
    public int LineEndingCharacterLength
    {
        get { return myLineEndingCharacterLength; }
        set { myLineEndingCharacterLength = value; }
    }

    public override string ReadLine()
    {
        string line = base.ReadLine();
        if (null != line)
            myStreamPosition += base.CurrentEncoding.GetByteCount(line) + myLineEndingCharacterLength;
        return line;
    }

    private long myStreamPosition = 0;
    public long Position
    {
        get { return myStreamPosition; }
        set
        {
            myStreamPosition = value;
            this.BaseStream.Position = value;
            this.DiscardBufferedData();
        }
    }
}

/// <summary>
/// 使用例
/// </summary>
private static void ReadFile(string file)
{
    using (PositionableStreamReader positionableStreamReader = new PositionableStreamReader(file))
    {
        while (positionableStreamReader.Peek() >= 0)
        {
            // 1行読み込みする
            string readLine = positionableStreamReader.ReadLine();
            string[] split = readLine.Split(',');

            // 処理・・・

            // 1行先をカンニングする
            if (positionableStreamReader.Peek() < 0)
            {
                // 最終行まで到達した
            }
            else
            {
                // ストリームの現在位置を記録する
                long position = positionableStreamReader.Position;

                // 1行先を取得する
                string nextLine = positionableStreamReader.ReadLine();

                // ストリームの現在位置を戻す
                positionableStreamReader.Position = position;

                // 処理・・・

            }
        }
    }
}

VB.NETの場合

Imports System.IO

Class PositionableStreamReader
    Inherits StreamReader

    Sub New(path As String)
        MyBase.New(path)
    End Sub

    Private myLineEndingCharacterLength As Integer = Environment.NewLine.Length
    Public Property LineEndingCharacterLength() As Integer
        Get
            Return myLineEndingCharacterLength
        End Get
        Set(ByVal value As Integer)
            myLineEndingCharacterLength = value
        End Set
    End Property

    Public Overrides Function ReadLine() As String
        Dim line As String = MyBase.ReadLine()
        If line IsNot Nothing Then
            myStreamPosition += MyBase.CurrentEncoding.GetByteCount(line) + myLineEndingCharacterLength
        End If
        Return line
    End Function

    Private myStreamPosition As Long = 0
    Public Property Position() As Long
        Get
            Return myStreamPosition
        End Get
        Set(ByVal value As Long)
            myStreamPosition = value
            MyBase.BaseStream.Position = value
            MyBase.DiscardBufferedData()
        End Set
    End Property
End Class

''' <summary>
''' 使用例
''' </summary>
Private Sub ReadFile(file As String)
    Using positionableStreamReader As New PositionableStreamReader(file)
        While (positionableStreamReader.Peek() >= 0)
            ' 1行読み込みする
            Dim readLine As String = positionableStreamReader.ReadLine()
            Dim split As String() = readLine.Split(","c)

            ' 処理・・・

            ' 1行先をカンニングする
            If (positionableStreamReader.Peek() < 0) Then
                ' 最終行まで到達した
            Else
                ' ストリームの現在位置を記録する
                Dim position As Long = positionableStreamReader.Position

                ' 1行先を取得する
                Dim nextLine As String = positionableStreamReader.ReadLine()

                ' ストリームの現在位置を戻す
                positionableStreamReader.Position = position

                ' 処理・・・

            End If
        End While
    End Using
End Sub

【C#】【VB.NET】CheckedListBoxがチェックされたときにイベントを発生させる

f:id:ktts:20190909225940p:plain

CheckedListBoxのチェック状態が変わったときにItemCheckイベントが発生するんですが、
チェック状態が更新されていないのでItemCheckEventArgsを調べなくてはいけません。
面倒なので簡便な手法がないか調べたところ、
遅延実行を利用するのがシンプルだったので手法をメモします。

参考サイト
stackoverflow.com

C#の場合

/// <summary>
/// checkedListBox1のItemCheckイベントハンドラー
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CheckedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    // チェックされた項目を表示する
    BeginInvoke(new Action(DisplayCheckedItems));
}

/// <summary>
/// TextBoxにチェックされた項目を表示します
/// </summary>
private void DisplayCheckedItems()
{
    StringBuilder stringBuilder = new StringBuilder();

    for (int i = 0; i < checkedListBox1.Items.Count; i++)
    {
        if (checkedListBox1.GetItemChecked(i))
        {
            stringBuilder.AppendLine($"{checkedListBox1.Items[i].ToString()}がチェックされました");
        }
    }

    textBox1.Text = stringBuilder.ToString();
}

VB.NETの場合

''' <summary>
''' CheckedListBox1のItemCheckイベントハンドラー
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub CheckedListBox1_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles CheckedListBox1.ItemCheck
    ' チェックされた項目を表示する
    BeginInvoke(New Action(AddressOf DisplayCheckedItems))
End Sub

''' <summary>
''' TextBoxにチェックされた項目を表示します
''' </summary>
Private Sub DisplayCheckedItems()
    Dim stringBuilder As New Text.StringBuilder()

    For index = 0 To CheckedListBox1.Items.Count - 1
        If CheckedListBox1.GetItemChecked(index) Then
            stringBuilder.AppendLine($"{CheckedListBox1.Items(index).ToString()}がチェックされました")
        End If
    Next

    TextBox1.Text = stringBuilder.ToString()
End Sub

【Office365】OneDriveのバージョン履歴を設定する

f:id:ktts:20190821003832p:plain

主に1TBのストレージ容量が魅力でOffice365のOneDriveを使ってみたので雑感を。
おおむね満足だけど、一番いけてないのはバージョン履歴を無効化できなくなったことでした。

参考サイト
support.live-style.jp

規定では500バージョンまで保存されるということで、
それはつまり最大で500倍も容量を食らってしまうことになります。
バージョン数を変更することは可能だけど設定がわかりずらいのでメモします。
(2019年8月時点)

参考サイト
answers.microsoft.com

以降の全ての作業はブラウザ版のOneDriveで
①左サイドメニューの「従来のOneDriveに戻す」をクリックします
f:id:ktts:20190821004609p:plain

※サイドメニューが表示されていない場合は、左上の「≡」ボタンをクリックすると展開されます
f:id:ktts:20190821004003p:plain

②右上の歯車から「リボンを表示」をクリックします
f:id:ktts:20190821004038p:plain

③ライブラリ>ライブラリの設定をクリックします
f:id:ktts:20190821004114p:plain

④バージョン設定をクリックします
f:id:ktts:20190821004202p:plain

⑤保存するメジャーバージョン数を入力してOKをクリックします
f:id:ktts:20190821004248p:plain

※100~50000以外はおこられるので、最低の100を入力しましょう
f:id:ktts:20190821004303p:plain

【C#】【VB.NET】CheckedListBoxの全てのチェックボックスをチェックする

f:id:ktts:20190816120708p:plain

CheckedListBoxの全てのチェックボックスをチェックする手法を調べたのでメモ

参考サイト
stackoverflow.com

C#の場合

/// <summary>
/// ボタンをクリックするとすべてのチェックボックスをチェックします
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonCheckAll_Click(object sender, EventArgs e)
{
    for (int i = 0; i < checkedListBox1.Items.Count; i++)
    {
        checkedListBox1.SetItemChecked(i, true);
    }
}

VB.NETの場合

''' <summary>
''' ボタンをクリックするとすべてのチェックボックスをチェックします
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub ButtonCheckAll_Click(sender As Object, e As EventArgs) Handles ButtonCheckAll.Click
    For index = 0 To CheckedListBox1.Items.Count - 1
        CheckedListBox1.SetItemChecked(index, True)
    Next
End Sub


頻繁に使用する場合は、拡張メソッドを定義して利用するのがいいでしょう
C#の場合

static class ExtensionMethods
{
    /// <summary>
    /// 全てのチェックボックスをチェックする拡張メソッド
    /// </summary>
    /// <param name="source">CheckedListBox</param>
    /// <param name="value">チェック値</param>
    public static void CheckAllCheckBoxes(this CheckedListBox source, bool value)
    {
        for (int i = 0; i < source.Items.Count; i++)
        {
            source.SetItemChecked(i, value);
        }
    }
}

VB.NETの場合

Module ExtensionMethods
    ''' <summary>
    ''' 全てのチェックボックスをチェックする拡張メソッド
    ''' </summary>
    ''' <param name="source">CheckedListBox</param>
    ''' <param name="value">チェック値</param>
    <System.Runtime.CompilerServices.Extension()>
    Public Sub CheckAllCheckBoxes(source As CheckedListBox, value As Boolean)
        For index = 0 To source.Items.Count - 1
            source.SetItemChecked(index, value)
        Next
    End Sub
End Module


拡張メソッドの使用例
C#の場合

// 全てのチェックボックスをチェックする
checkedListBox1.CheckAllCheckBoxes(true);

VB.NETの場合

' 全てのチェックボックスをチェックする
CheckedListBox1.CheckAllCheckBoxes(True)