■No34184に返信(ケミカルさんの記事) > dataTable2.cleear();をした後にボタンを押してもListBox2にデータが何も表示され cleear というのは Clear のことでしょうか。 dataTable2.Rows.Clear(); ではなく dataTable2.Clear(); ということは、 型付 DataSet をお使いでしょうか。 > ListBox2にデータが何も表示されません。 DataSource のインスタンスが指し変わっていることは無いでしょうか。 当方で下記のコードをテストしてみましたが、button2 押下時に listBox2 の内容が変化していました。(VS2017 + .NET 3.5 で確認) public partial class Form1 : Form { public Form1() { InitializeComponent(); } DataTable dataTable1; DataTable dataTable2; private void Form1_Load(object sender, EventArgs e) { dataTable1 = new DataSet("DataSet1").Tables.Add("DataTable1"); dataTable2 = new DataSet("DataSet1").Tables.Add("DataTable1"); dataTable1.Columns.Add("DataColumn1"); dataTable2.Columns.Add("DataColumn1"); dataTable1.Rows.Add("aaa"); dataTable1.Rows.Add("bbb"); dataTable1.Rows.Add("ccc"); dataTable1.AcceptChanges(); dataTable2.Rows.Add("xxx"); dataTable2.AcceptChanges(); listBox1.DataSource = dataTable1; listBox1.DisplayMember = "DataColumn1"; listBox2.DisplayMember = "DataColumn1"; listBox2.DataSource = dataTable2; } private void button1_Click(object sender, EventArgs e) { dataTable2.Rows.Clear(); } private void button2_Click(object sender, EventArgs e) { dataTable2.Rows.Add("TEST" + DateTime.Now.Ticks); } }
dataTable2.Rows.Clear(); ではなくdataTable2.Clear(); でした。失礼しました。 型付DataSetです。そして、dataTable2.Clear();のせいで希望通りの動きにならないと 思っていましたが間違いでした。これは問題ありませんでした。 問題になっているのは、追記しました「button3」の箇所でした。 データベースに問合せをして、データが存在していれば、引き続き button2を押しても正しくdataTable2にデータが追加されListBox2にもデータが表示されていました。 しかし、データベースにデータがなかった場合、button2を押すと dataTable2にはデータは追記されるものの(ブレイクポイントを設定して中身を見ています)、 ListBox2には値が表示されませんでした。 using System; using System.Data; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } DataTable dataTable1; DataTable dataTable2; private void Form1_Load(object sender, EventArgs e) { dataTable1 = new DataSet("DataSet1").Tables.Add("DataTable1"); dataTable2 = new DataSet("DataSet1").Tables.Add("DataTable1"); dataTable1.Columns.Add("DataColumn1"); dataTable2.Columns.Add("DataColumn1"); dataTable1.Rows.Add("aaa"); dataTable1.Rows.Add("bbb"); dataTable1.Rows.Add("ccc"); dataTable1.AcceptChanges(); dataTable2.Rows.Add("xxx"); dataTable2.AcceptChanges(); listBox1.DataSource = dataTable1; listBox1.DisplayMember = "DataColumn1"; listBox2.DisplayMember = "DataColumn1"; listBox2.DataSource = dataTable2; } private void button1_Click_1(object sender, EventArgs e) { dataTable2.Rows.Clear(); } private void button2_Click_1(object sender, EventArgs e) { dataTable2.Rows.Add("TEST" + DateTime.Now.Ticks); } private void button3_Click(object sender, EventArgs e) { //DB接続部分省略 var strSQL = "select * from table where col = '100'"; using (SQLCommand command = new SQLCommand(sql, connection)) { using (SQLDataAdapter adp = new SQLDataAdapter()) { adp.SelectCommand = command; adp.Fill(dataTable2); } } } } }
何度もすいません。実際のコードは下記にあるような感じになっています。 Load時にデータベースにはデータがあるものとして、ListBox1にはデータが 表示されます。 @こちらは正しく動きます。 ・Button1を実行 ・Button2を実行(データベースにデータが存在する場合、ListBox2にデータが表示される) ・Button1を実行 ・ListBox2に追加でデータが表示されます Aこちらは正しく動きません ・Button1を実行 ・Button2を実行(データベースにデータが存在しない場合、ListBo2にデータは何も表示されない) ・Button1を実行 ・ListBox2に追加でデータが表示されない。ただし、実際にはdataTable2にデータは格納されている。 using System; using System.Data; using System.Windows.Forms; using System.Data.SqlClient; namespace WindowsFormsApplication1 { public partial class Form1 : Form { //---------------------------- // dataTable1の構造とDataTable2の構造は違います。 public Form1() { InitializeComponent(); } //普通のDataTable DataTable dataTable1 = new DataTable(); //型付データセット DataTable dataTable2 = new DataSet().Table; //Formロード private void Form1_Load(object sender, EventArgs e) { //リストボックスに表示 var strSql = @"SELECT * FROM T where col1 = 'X'"; dataTable1 = DoSomething.selectSQL(strSql); listBox1.DataSource = dataTable1; listBox1.DisplayMember = "column1"; listBox2.DataSource = dataTable2; listBox2.DisplayMember = "column1"; } //選択されたListBox1の値をListBox2に表示させる private void button1_Click_1(object sender, EventArgs e) { var row = listBox1.SelectedItem as DataRowView; dataTable2.Rows.Add(row["column1"].ToString()); } //ListBox2に新しくデータをセットする private void button2_Click_1(object sender, EventArgs e) { var strSql = @"SELECT * FROM T where col1 = 'Y'"; dataTable2.Clear(); dataTable2 = DoSomething.selectSQL(strSql); listBox2.DataSource = dataTable2; listBox2.DisplayMember = "column1"; } } class DoSomething //こちらはClassファイルとして別で本当は持っています { public static DataTable selectSQL(string sql) { DataTable dt = new DataTable(); using (var con = new SqlConnection("Data Source = datasource")) { con.Open(); using (SqlCommand command = new SqlCommand(sql, con)) { using (SqlDataAdapter adapter = new SqlDataAdapter()) { //実行時にDBにデータが無いとButton2を押してもデータがListBox2に表示されない adapter.SelectCommand = command; adapter.Fill(dt); return dt; } } } } } }