C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

DataTableから行を削除する方法 /やまびこ (19/02/08(Fri) 18:21) #90100
Re[1]: DataTableから行を削除する方法 /魔界の仮面弁士 (19/02/08(Fri) 19:05) #90101
  └ Re[2]: DataTableから行を削除する方法 /やまびこ (19/02/08(Fri) 20:07) #90102
    └ Re[3]: DataTableから行を削除する方法 /魔界の仮面弁士 (19/02/08(Fri) 22:49) #90104
      └ Re[4]: DataTableから行を削除する方法 /やまびこ (19/02/13(Wed) 11:06) #90162 解決済み


親記事 / ▼[ 90101 ]
■90100 / 親階層)  DataTableから行を削除する方法
□投稿者/ やまびこ (1回)-(2019/02/08(Fri) 18:21:26)

分類:[.NET 全般] 

DataTableに1列、重複の無いデータが入っています。指定した文字列と合致する行をDataTableから削除したいです。

DataTable dt = new DataTable();
dt.Columns.Add("A");
dt.Columns.Add("B");
dt.Columns.Add("C");
for (int i = 0; i < 5; i++)
{
DataRow dr = dt.NewRow();
dr["A"] = "1";
dr["B"] = "B" + i.ToString();
dr["C"] = "C" + i.ToString();
dt.Rows.Add(dr);
}

// 「A」列を削除
dt.Columns.Remove("A");
// 2行目を削除
dt.Rows.RemoveAt(1);

上記のようにremoveメソッドを使って行を消すことはわかりました。
やりたいのは、指定した文字列と合致した行を消したいです。
dt.Rows.Remove("C1");
のような事ができないかと思っています。

DataTableの上から下までForEachでまわして、合致しているデータがあれば、その行を消すといった処理方法しかないでしょうか?

使用している環境はVisual Studio 2015, C#, Windows 10になります。
[ □ Tree ] 返信 編集キー/

▲[ 90100 ] / ▼[ 90102 ]
■90101 / 1階層)  Re[1]: DataTableから行を削除する方法
□投稿者/ 魔界の仮面弁士 (2043回)-(2019/02/08(Fri) 19:05:38)
No90100 (やまびこ さん) に返信
> DataTableに1列、重複の無いデータが入っています。指定した文字列と合致する行をDataTableから削除したいです。

削除するなら、該当行の Delete メソッド
除去するなら Rows.Remove / RemoveAt メソッド


前者は行に対して「削除済み」マークを付けるものです。(DataRowState.Deleted)
DataGridView にバインドして行削除したような場合は、この状態になります。
削除済み行は、削除結果をデータベース等に反映させるために使われます。

一方後者は、DataTable 上から完全に取り除きます。(DataRowState.Detached)
前者の削除済み行に対して AcceptChanges メソッドを呼んだ場合も、後者の状態になります。


> DataTableの上から下までForEachでまわして、合致しているデータがあれば、その行を消すといった処理方法しかないでしょうか?
DataTable の PrimaryKey プロパティが設定されていれば、
DataTable の .Rows.Find メソッドで検索できます。

PrimaryKey が未設定、または PrimaryKey 以外の検索の場合には、
DataTable の Select メソッドや DataView クラスの Filter プロパティを使えます。
ただ、これらは検索式を文字列として記述しなければならないので、
LINQ の where クエリ(または Where 拡張メソッド)で取得したほうが良いでしょう。
[ 親 90100 / □ Tree ] 返信 編集キー/

▲[ 90101 ] / ▼[ 90104 ]
■90102 / 2階層)  Re[2]: DataTableから行を削除する方法
□投稿者/ やまびこ (2回)-(2019/02/08(Fri) 20:07:20)
魔界の仮面弁士さん

ご回答ありがとうございます。やりたかった事が、下記のサイトのように2つのリストボックスがあり、
片方から片方へとデータを移動させるということをやりたかったです。
https://blog.trippyboy.com/2010/c/c%E3%80%80listbox%E3%80%80%E4%BB%96%E3%81%AElistbox%E3%81%B8%E3%81%AE%E7%A7%BB%E5%8B%95/


ただ、ListBox1はDataTableをセットしています。
ListBox1.DataSource = DataTable;
ListBox1.DisplayMember = "ID";

なので、DataTableからデータを削除する方法が知りたかったです。
PrimaryKeyは設定していないので、LINQについて調べてみます(こちらは全くやったことがありません)。

完全にDataTableから除去したいわけではないので、Delete メソッドを試してみます。
ありがとうございます。
[ 親 90100 / □ Tree ] 返信 編集キー/

▲[ 90102 ] / ▼[ 90162 ]
■90104 / 3階層)  Re[3]: DataTableから行を削除する方法
□投稿者/ 魔界の仮面弁士 (2044回)-(2019/02/08(Fri) 22:49:16)
No90102 (やまびこ さん) に返信
> 2つのリストボックスがあり、片方から片方へとデータを移動させる

データバインドをお使いということであれば、
それぞれの ListBox に別々の DataTable を用意して、行を移動させる方法と、
両方の ListBox に同一の DataTable を共有させ、フィルターで絞り込む方法がありますね。


private void Form1_Load(object sender, EventArgs e)
{
 DataTable tbl = CreateSampleTable();

 tbl.Columns.Add("Selected", typeof(bool));
 listBox1.DataSource = new DataView(tbl, "ISNULL(Selected, false)=false", "", DataViewRowState.CurrentRows);
 listBox2.DataSource = new DataView(tbl, "ISNULL(Selected, false)=true", "", DataViewRowState.CurrentRows);
 listBox1.DisplayMember = listBox2.DisplayMember = "名前";

 MouseEventHandler MoveItem = (o, arg) =>
 {
  var rowView = ((ListBox)o).SelectedItem as DataRowView;
  if (rowView != null)
  {
   rowView.BeginEdit();
   rowView["Selected"] = (o == listBox1);
   rowView.EndEdit();
  }
 };
 listBox1.MouseDoubleClick += MoveItem;
 listBox2.MouseDoubleClick += MoveItem;
}

private static DataTable CreateSampleTable()
{
 var tbl = new DataTable("果物");
 tbl.Columns.Add("名前");
 tbl.Rows.Add("麝香猫果");
 tbl.Rows.Add("無花果");
 tbl.Rows.Add("葡萄柚");
 tbl.Rows.Add("五歛子");
 tbl.Rows.Add("鰐梨");
 tbl.Rows.Add("鳳梨");
 tbl.Rows.Add("檸檬");
 tbl.Rows.Add("茘枝");
 tbl.AcceptChanges();
 return tbl;
}
[ 親 90100 / □ Tree ] 返信 編集キー/

▲[ 90104 ] / 返信無し
■90162 / 4階層)  Re[4]: DataTableから行を削除する方法
□投稿者/ やまびこ (3回)-(2019/02/13(Wed) 11:06:00)
ありがとうございます。DataTableを2つ作るという案を使用したいと思います。
解決済み
[ 親 90100 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -