.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
結果
【cmd】treeコマンドで特定の拡張子のみ出力する
Windowsにおけるtreeコマンドで特定の拡張子のみ出力する手法を調べたのでノートします。
下記のフォルダ構造でtxtファイルのみを出力します。
tree /f /a | findstr /ri /c:"^[^| ]" /c:"^[| ]*[+\\]" /c:"\.txt$"
参考サイト
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がチェックされたときにイベントを発生させる
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のバージョン履歴を設定する
主に1TBのストレージ容量が魅力でOffice365のOneDriveを使ってみたので雑感を。
おおむね満足だけど、一番いけてないのはバージョン履歴を無効化できなくなったことでした。
参考サイト
support.live-style.jp
規定では500バージョンまで保存されるということで、
それはつまり最大で500倍も容量を食らってしまうことになります。
バージョン数を変更することは可能だけど設定がわかりずらいのでメモします。
(2019年8月時点)
参考サイト
answers.microsoft.com
以降の全ての作業はブラウザ版のOneDriveで
①左サイドメニューの「従来のOneDriveに戻す」をクリックします
※サイドメニューが表示されていない場合は、左上の「≡」ボタンをクリックすると展開されます
②右上の歯車から「リボンを表示」をクリックします
③ライブラリ>ライブラリの設定をクリックします
④バージョン設定をクリックします
⑤保存するメジャーバージョン数を入力してOKをクリックします
※100~50000以外はおこられるので、最低の100を入力しましょう
【C#】【VB.NET】CheckedListBoxの全てのチェックボックスをチェックする
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)