動くコード図鑑
$ ls -1 /library | wc -l → 619
触って動く、検証済みの正解集。
公開記事から抽出した全コードブロックを 1 つずつページ化。 ▶ ボタンで 実行ログを再生し、 さも今動いてるかのように出力を流す。

この図鑑の使い方
言語で絞る
C# / SQL / TypeScript / PowerShell / Bash でフィルタ。
▶ で実行
事前収録の出力を 1 行ずつ再生。 ぱっと結果が見える。
記事と接続
各 snippet は出典記事へのリンク付き。 文脈ごと読める。
絞り込み
snippet 一覧
473 件// NGパターン:null を挟まない dgv.DataSource = dt1; // (ユーザーが操作) dgv.DataSource = dt2; // 前の選択行・ソート状態を引きずる
パターン2: DataSource = nullを挟まずに直接置き換え
C# DataGridView の DataSource を後から変更する全パターン未収録#78d4c57559d1
// NGパターン:DataSource バインド中に Columns.Clear() dgv.DataSource = dt1; dgv.Columns.Clear(); // System.InvalidOperationException
パターン3: Columns.Clear()を呼ぶタイミングを間違えている
C# DataGridView の DataSource を後から変更する全パターン未収録#ae04c8396101
// Form_Load などの初期化時に1回だけ dgv.AutoGenerateColumns = false; // デザイナで作っておいた列の DataPropertyName を DataTable のカラム名と合わせる // dgv.Columns["colId"].DataPropertyName = "id";
パターン1: AutoGenerateColumnsを切って手動で列定義する(推奨)
C# DataGridView の DataSource を後から変更する全パターン未収録#ec3ad2300ef3
// フィールドとして1個持っておく private readonly BindingSource _bs = new BindingSource(); // 初期化時 dgv.AutoGenerateColumns = false;
パターン2: BindingSourceを間に挟む
C# DataGridView の DataSource を後から変更する全パターン未収録#0efb9f7de32a
private void SwitchToInventory(DataTable dt) { dgv.DataSource = null; dgv.Columns.Clear(); dgv.AutoGenerateColumns = false;
パターン3:列を完全に作り直す(複数の異なるテーブルを切り替えたい時)
C# DataGridView の DataSource を後から変更する全パターン未収録#d9e99220a5de
private void RebindGrid(DataTable newDt) { dgv.SelectionChanged -= Dgv_SelectionChanged; try {
イベントハンドラが二重で飛んでくる
C# DataGridView の DataSource を後から変更する全パターン未収録#4c679a21738a
// NGパターン:null チェック無し private void Dgv_SelectionChanged(object sender, EventArgs e) { label1.Text = dgv.CurrentCell.Value.ToString(); // 差し替え直後にここで落ちる }
CurrentCellのnull参照例外
C# DataGridView の DataSource を後から変更する全パターン未収録#7730418536ac
// 並び順を保持して差し替える var sortedCol = dgv.SortedColumn?.Name; var sortDir = dgv.SortOrder; dgv.DataSource = null;
Sortの方向と矢印が消える
C# DataGridView の DataSource を後から変更する全パターン未収録#4d6ed38713ec
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
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
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
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
// ✅定石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
// ✅定石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
// ✅定石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
// ❌ 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
// ✅定石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
// ❌これは動かない 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
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
//価格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
//カテゴリ別の件数と合計金額 var summary = dt.AsEnumerable() .GroupBy(r => r.Field<string>("category")) .Select(g => new {
▶ 実行可
パターン2: GroupBy +集計(Sum / Count / Average)
C# DataTable を LINQ でフィルタ・GroupBy・分割する3パターン#4012f8c5d3ba
//価格1000以上の行だけ別DataTableに分割 var highPriceRows = dt.AsEnumerable() .Where(r => r.Field<int>("price")>= 1000); DataTable dtHighPrice;
パターン3:分割(CopyToDataTable / ImportRow)
C# DataTable を LINQ でフィルタ・GroupBy・分割する3パターン未収録#59d35ff0dae0
DataTable dtCopy = dt.Clone(); //スキーマだけコピー foreach (var r in highPriceRows) { dtCopy.ImportRow(r); }
パターン3:分割(CopyToDataTable / ImportRow)
C# DataTable を LINQ でフィルタ・GroupBy・分割する3パターン未収録#7a058a47bdcf
// ❌ NG: NULL許容な列にField<int>を使うとNULL行で例外 var prices = dt.AsEnumerable() .Select(r => r.Field<int>("amount"))// amountがNULLの行で例外(Typed DataSetならStrongTypingException、一般ADO.NETではInvalidCastException) .ToList();
DBNullのハマり:Field vs Field<int?>
C# DataTable を LINQ でフィルタ・GroupBy・分割する3パターン未収録#765e4bcb985a
//テーブル定義: amount INT NOT NULL // ❌ NG: longで受けると例外 var v = r.Field<long>("amount"); // ✅ OK: intで受けてからlongにキャスト
① Fieldの型違いで例外(StrongTypingExceptionまたはInvalidCastException)
C# DataTable を LINQ でフィルタ・GroupBy・分割する3パターン未収録#e76e89398b5b
// ❌ NG:該当行が0件だとInvalidOperationException var dtNew = dt.AsEnumerable() .Where(r => r.Field<int>("price")> 99999)//空ヒット .CopyToDataTable();
② CopyToDataTable()で空シーケンス例外
C# DataTable を LINQ でフィルタ・GroupBy・分割する3パターン未収録#89e5ba9d27e6
// ❌ 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
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
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
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