動くコード図鑑技術記事現場の渡り方キャリア論すべての記事About

動くコード図鑑

$ ls -1 /library | wc -l → 619

触って動く、検証済みの正解集。

公開記事から抽出した全コードブロックを 1 つずつページ化。 ▶ ボタンで 実行ログを再生し、 さも今動いてるかのように出力を流す。

この図鑑の使い方

言語で絞る

C# / SQL / TypeScript / PowerShell / Bash でフィルタ。

▶ で実行

事前収録の出力を 1 行ずつ再生。 ぱっと結果が見える。

記事と接続

各 snippet は出典記事へのリンク付き。 文脈ごと読める。

絞り込み

snippet 一覧

473
C#
// NGパターン:null を挟まない
dgv.DataSource = dt1;
// (ユーザーが操作)
dgv.DataSource = dt2;  // 前の選択行・ソート状態を引きずる

パターン2: DataSource = nullを挟まずに直接置き換え

C# DataGridView の DataSource を後から変更する全パターン未収録#78d4c57559d1
C#
// NGパターン:DataSource バインド中に Columns.Clear()
dgv.DataSource = dt1;
dgv.Columns.Clear();  // System.InvalidOperationException

パターン3: Columns.Clear()を呼ぶタイミングを間違えている

C# DataGridView の DataSource を後から変更する全パターン未収録#ae04c8396101
C#
// Form_Load などの初期化時に1回だけ
dgv.AutoGenerateColumns = false;

// デザイナで作っておいた列の DataPropertyName を DataTable のカラム名と合わせる
// dgv.Columns["colId"].DataPropertyName = "id";

パターン1: AutoGenerateColumnsを切って手動で列定義する(推奨)

C# DataGridView の DataSource を後から変更する全パターン未収録#ec3ad2300ef3
C#
// フィールドとして1個持っておく
private readonly BindingSource _bs = new BindingSource();

// 初期化時
dgv.AutoGenerateColumns = false;

パターン2: BindingSourceを間に挟む

C# DataGridView の DataSource を後から変更する全パターン未収録#0efb9f7de32a
C#
private void SwitchToInventory(DataTable dt)
{
    dgv.DataSource = null;
    dgv.Columns.Clear();
    dgv.AutoGenerateColumns = false;

パターン3:列を完全に作り直す(複数の異なるテーブルを切り替えたい時)

C# DataGridView の DataSource を後から変更する全パターン未収録#d9e99220a5de
C#
private void RebindGrid(DataTable newDt)
{
    dgv.SelectionChanged -= Dgv_SelectionChanged;
    try
    {

イベントハンドラが二重で飛んでくる

C# DataGridView の DataSource を後から変更する全パターン未収録#4c679a21738a
C#
// NGパターン:null チェック無し
private void Dgv_SelectionChanged(object sender, EventArgs e)
{
    label1.Text = dgv.CurrentCell.Value.ToString();  // 差し替え直後にここで落ちる
}

CurrentCellのnull参照例外

C# DataGridView の DataSource を後から変更する全パターン未収録#7730418536ac
C#
// 並び順を保持して差し替える
var sortedCol = dgv.SortedColumn?.Name;
var sortDir = dgv.SortOrder;

dgv.DataSource = null;

Sortの方向と矢印が消える

C# DataGridView の DataSource を後から変更する全パターン未収録#4d6ed38713ec
C#
private void dgv_CurrentCellChanged(object sender, EventArgs e)
{
    // Form_Load 直後にも 1 回呼ばれるので、CurrentRow null チェック必須
    var row = dgv.CurrentRow;
    if (row == null || row.IsNewRow) return;

結論: 行選択 → 明細表示なら CurrentCellChanged + 起動時 guard

C# DataGridView 行選択イベント 3 種 — SelectionChanged / CellEnter / CurrentCellChanged の使い分け早見表未収録#dee12d925606
C#
private void dgv_SelectionChanged(object sender, EventArgs e)
{
    // 選択範囲のセル数を集計する用途には向く
    var selectedCount = dgv.SelectedRows.Count;
    lblStatus.Text = $"選択中: {selectedCount} 行";

パターン 1: SelectionChanged — 複数選択の集計に使う

C# DataGridView 行選択イベント 3 種 — SelectionChanged / CellEnter / CurrentCellChanged の使い分け早見表未収録#8e821ac45fd9
C#
private void dgv_CellEnter(object sender, DataGridViewCellEventArgs e)
{
    // 「このセルに入ってきた瞬間」を取れる
    if (e.RowIndex < 0) return; // ヘッダー行ガード
    Debug.WriteLine($"CellEnter: Row={e.RowIndex}, Col={e.ColumnIndex}");

パターン 2: CellEnter — セル入場時の検証に使う

C# DataGridView 行選択イベント 3 種 — SelectionChanged / CellEnter / CurrentCellChanged の使い分け早見表未収録#e50e68449b2b
C#
private void dgv_CurrentCellChanged(object sender, EventArgs e)
{
    var row = dgv.CurrentRow;
    if (row == null || row.IsNewRow) return; // ★ Form_Load 直後の 1 回発火対策

パターン 3: CurrentCellChanged — 行を選んだ瞬間の明細表示に使う (推奨)

C# DataGridView 行選択イベント 3 種 — SelectionChanged / CellEnter / CurrentCellChanged の使い分け早見表未収録#32603401ecad
C#
// ✅定石1: SqlDataReaderでストリーム読み取り
using (var conn = new SqlConnection(connStr))
using (var cmd = new SqlCommand("SELECT id, name, amount FROM order_log WHERE status = @s", conn))
{
    conn.Open();

定石1: DataReaderの最小コード—ストリーム読み取り

C# DataReader vs DataAdapter — メモリ消費と性能の使い分け(業務SE 判断軸)未収録#1804e9186ec0
C#
// ✅定石2: SqlDataAdapterでDataTableにバルクロード
DataTable dt = new DataTable();

using (var conn = new SqlConnection(connStr))
using (var adapter = new SqlDataAdapter("SELECT id, name, amount FROM order_log WHERE status = @s", conn))

定石2: DataAdapterの最小コード— DataTableバルクロード

C# DataReader vs DataAdapter — メモリ消費と性能の使い分け(業務SE 判断軸)未収録#b20554e37854
C#
// ✅定石3:メモリ・実行時間の実測比較
const string sql = "SELECT id, name, memo, amount, created_at FROM big_log";

// --- DataAdapter版---
GC.Collect(); GC.WaitForPendingFinalizers();
▶ 実行可

定石3:メモリ消費の実測比較— Stopwatch + GC.GetTotalMemory

C# DataReader vs DataAdapter — メモリ消費と性能の使い分け(業務SE 判断軸)#8e4ad96d6711
C#
// ❌ NG: DataReader.GetInt32()にNULLが来ると例外
int id = reader.GetInt32(0);   // NULL行でSqlNullValueException

// ✅ OK: DataReaderはIsDBNullで先にチェック
int? id = reader.IsDBNull(0)? (int?)null : reader.GetInt32(0);

定石4: NULL値ハンドリングの違い

C# DataReader vs DataAdapter — メモリ消費と性能の使い分け(業務SE 判断軸)未収録#a39fc22a5b9a
C#
// ✅定石4-b: DataReader用NULL安全ヘルパー
public static class ReaderEx
{
    public static int? GetIntOrNull(this SqlDataReader r, int i)
        => r.IsDBNull(i)? (int?)null : r.GetInt32(i);

定石4: NULL値ハンドリングの違い

C# DataReader vs DataAdapter — メモリ消費と性能の使い分け(業務SE 判断軸)未収録#e782c17c1e04
C#
// ❌これは動かない
var actives = dt.Where(r => r["IsActive"].ToString()== "1");
//             ↑ 'DataTable'に'Where'の定義はない

var actives = dt.Where(r => r["IsActive"].ToString()== "1");

C# DataTable を LINQ でフィルタ・GroupBy・分割する3パターン未収録#26dc8b3f4917
C#
using System.Data;
using System.Linq;
// using System.Data.DataSetExtensions;  // .NET Framework 4.0以降は標準で参照済みのはず

DataTable dt = LoadFromDb();   // SqlDataAdapterで埋めたDataTable

前提:AsEnumerable()でIEnumerable化する

C# DataTable を LINQ でフィルタ・GroupBy・分割する3パターン未収録#a9874e6cceab
C#
//価格1000以上、かつ"在庫あり"のフラグが立ってる行を抽出
var filtered = dt.AsEnumerable()
    .Where(r => r.Field<int>("price")>= 1000
             && r.Field<bool>("in_stock"));

▶ 実行可

パターン1:フィルタ(Where)

C# DataTable を LINQ でフィルタ・GroupBy・分割する3パターン#4d40bef0f3f9
C#
//カテゴリ別の件数と合計金額
var summary = dt.AsEnumerable()
    .GroupBy(r => r.Field<string>("category"))
    .Select(g => new
    {
▶ 実行可

パターン2: GroupBy +集計(Sum / Count / Average)

C# DataTable を LINQ でフィルタ・GroupBy・分割する3パターン#4012f8c5d3ba
C#
//価格1000以上の行だけ別DataTableに分割
var highPriceRows = dt.AsEnumerable()
    .Where(r => r.Field<int>("price")>= 1000);

DataTable dtHighPrice;

パターン3:分割(CopyToDataTable / ImportRow)

C# DataTable を LINQ でフィルタ・GroupBy・分割する3パターン未収録#59d35ff0dae0
C#
DataTable dtCopy = dt.Clone();   //スキーマだけコピー
foreach (var r in highPriceRows)
{
    dtCopy.ImportRow(r);
}

パターン3:分割(CopyToDataTable / ImportRow)

C# DataTable を LINQ でフィルタ・GroupBy・分割する3パターン未収録#7a058a47bdcf
C#
// ❌ NG: NULL許容な列にField<int>を使うとNULL行で例外
var prices = dt.AsEnumerable()
    .Select(r => r.Field<int>("amount"))// amountNULLの行で例外(Typed DataSetならStrongTypingException、一般ADO.NETではInvalidCastException
    .ToList();

DBNullのハマり:Field vs Field<int?>

C# DataTable を LINQ でフィルタ・GroupBy・分割する3パターン未収録#765e4bcb985a
C#
//テーブル定義: amount INT NOT NULL
// ❌ NG: longで受けると例外
var v = r.Field<long>("amount");

// ✅ OK: intで受けてからlongにキャスト

① Fieldの型違いで例外(StrongTypingExceptionまたはInvalidCastException)

C# DataTable を LINQ でフィルタ・GroupBy・分割する3パターン未収録#e76e89398b5b
C#
// ❌ NG:該当行が0件だとInvalidOperationException
var dtNew = dt.AsEnumerable()
    .Where(r => r.Field<int>("price")> 99999)//空ヒット
    .CopyToDataTable();

② CopyToDataTable()で空シーケンス例外

C# DataTable を LINQ でフィルタ・GroupBy・分割する3パターン未収録#89e5ba9d27e6
C#
// ❌ NG:同じフィルタを2回評価する
var filtered = dt.AsEnumerable().Where(r => r.Field<int>("price")> 1000);

int count = filtered.Count();             // 1回目スキャン
int sum = filtered.Sum(r => r.Field<int>("price"));   // 2回目スキャン

③大きなDataTableでWhereを多重に重ねると遅い

C# DataTable を LINQ でフィルタ・GroupBy・分割する3パターン未収録#63b6403cfb95
C#
var joined = from o in dtOrders.AsEnumerable()
             join c in dtCustomers.AsEnumerable()
                  on o.Field<int>("customer_id")equals c.Field<int>("id")
             select new
             {
▶ 実行可

Q3.複数のDataTableをJOINしたい時は?

C# DataTable を LINQ でフィルタ・GroupBy・分割する3パターン#bbcfef773b6a
C#
using System;
using System.Data;
using System.Linq;

var dt = new DataTable();
▶ 実行可

パターン①: AsEnumerable().Skip(offset).Take(pageSize)

C# DataTable の大量行を Skip&Take でページングする3パターン — 1万行を1000件ずつ処理する設計#36a8c2d13d9e
C#
var dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("name", typeof(string));
for (int i = 1; i <= 10000; i++) {
    dt.Rows.Add(i, $"item-{i}");
▶ 実行可

パターン②: forループ+ Rows[i] (LINQ不使用・メモリ効率)

C# DataTable の大量行を Skip&Take でページングする3パターン — 1万行を1000件ずつ処理する設計#d083059d494f