DOBON.NETプログラミング道掲示板

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
UpDateVB.netにおける固定長出力方法(3) | NomalDataObjectの使いまわし(5) | NomalVB.NETからRDゲートウェイを利用したリモートデスクトップ接続(3) | NomalLIstview のDataSource(2) | NomalClassの作り方(2) | NomalOpenFileDialogの初期ファイル名の表示が変(1) | NomalVB.NETのVBA化(2) | Nomal改行のコード(7) | NomalGoogle翻訳の結果の取得(2) | NomalStopwatchクラスのElapsedMillisecondsの挙動(2) | Nomal.net Chartで二重ドーナツグラフの作り方(3) | Nomalexeをショートカットから起動した場合のエラー(2) | Nomalデスクトップ と Desktop(6) | Nomalデザイナのプロパティウィンドウで静的プロパティを選択したい(3) | NomalPHPでシリアライズした、データをデシリアライズしたい(4) | Nomal二次元配列 インデックスが配列の境界外(2) | NomalVB.netで作成したexeのNgenによる弊害(1) | NomalDrawBezierの使い方について(7) | Nomalメジャーバージョンの異なるLog4netライブラリを参照したい(4) | NomalVB6→2005変換時のDeclare宣言のマーシャリング属性(8) | NomalGROUPBOXの複製について(vb.net)(1) | NomalActiveReports 3.0からActiveReports 7.0へのァイルコンバータについて(4) | NomalAccess OLEでExecuteNonQuery(3) | NomalKeyDownでの右コントロールキーイベント(2) | NomalExcel複数シートの印刷順序(3) | NomalWMPへno(3) | NomalDataGridViewの行番号(7) | Nomalapp.config定義によるネットワークトレースログの世代管理(2) | Nomalrelease/debugのどちらで作成されたものかを判断する方法(2) | NomalC#コンソールアプリでタイピング練習ソフト作成(3) | Nomal自分自身を呼び出すのはOKですか(1) | NomalWebBrowser Control foreachで値が消える(2) | NomalDeclare宣言するdllと参照追加をするdllの区別(4) | NomalTaskクラスを.NET Framework 2.0で実現させる方法(2) | NomalVS2017で作成されたDLLをVS2005で作成されたAPで使用する方法(4) | NomalWebBrowser Controlを使って、任意の値を取得(5) | NomalEditボックスに簡体字をセットする方法(2) | NomalList型でエラーが起きてしまい・・・(1) | Nomalフォルダ内の全ての容量を取得したい(4) | NomalWebClientが上手く動かない(2) | Nomal共変性と反変性ってこういうこと?(4) | Nomalモードレスフォーム Warning IDE0067を回避したい(7) | NomalLINQの拡張メソッドの定義(1) | Nomalこんな演算子初めて見ました。(5) | Nomalプロセスからウインドウを取得(4) | Nomalフォーム外のカーソルの変更(2) | NomalLINQのメソッド構文の書き方(3) | NomalVB.NETでCSVを読み込む際にSQL文を使いたい(3) | NomalRichTextBoxで入力文字の自動折り返しを止めたい(2) | NomalRichTextBoxで入力文字の自動折り返しを止めたい(5) | Nomalラムダ式の勉強中(2) | NomalWebClientで、短期間にDownloadStringAsyncを実行したい(2) | Nomalvb.net+SQLiteで複数データベースファイルへのトランザクション方法(3) | NomalNewの使い方間違ってますか?(4) | Nomalジェネリック型インターフェースを使った変数を扱いたい(3) | NomalC#をVBに変換(2) | NomalProcess.WaitForExitで正常に動作しない?(3) | NomalCatch時のex.StackTraceの情報(3) | Nomalユーザーコントロール内のテキストボックスのmodifiedプロパティ(4) | NomalPictureBox.Locationのキャンセル(3) | NomalJOIN操作の構文エラー(4) | NomalVisualStudioでマクロ(3) | NomalVisualStudioでExcelのVSTO開発(3) | NomalOracleDataAccess を参照したプログラムでデバッグモードが機能しなくなる(3) | NomalIE11では表示されるが、.netのWebBrowserでは、表示されないHPを表示する方法(7) | NomalマウスのないOSでマウスカーソルの表示(2) | NomalRDP接続でのネットワーク帯域制限(0) | NomalFILE.COPYでIOExceptionエラーが出る(11) | NomalToolStripMenuItemにShortcutKeysを指定した際の、元のコントロールを取得する方法(2) | Nomal動的にプロパティや変数の値の取得(4) | NomalVB6 ほかのアプリケーションを起動し そのアプリケーションは終了させる方法(4) | NomalMouseEventArgsのカレント座標(2) | Nomalリッチテキストボックスでの字間の調整(2) | NomalDrawImage でメモリ不足エラー(3) | Nomal必須コンポーネントの一覧に追加したい(0) | NomalCode128でバーコードが読み取れない(8) | NomalあるWindows10PCでビルドしたEXEがW8.1以下で実行エラー(5) | NomalApp.configのMy.Application.Log設定で使用できない属性が出る(0) | NomalVC++ → VB.Netに変換時に文法エラー(2) | Nomalvb2010を使用したmicrosoft Wordの任意の行の削除(0) | NomalVb.netからAccessへの接続について(3) | NomalSQL-Server Compact 4.0が表示されない(2) | Nomalバーコードの数字を非表示にしたい(2) | Nomal令和の日付への対応(3) | Nomalスクロールバーが出た時に高さを変えたい(4) | Nomal自作したアプリの発行元を明記したい(2) | NomalHTTP 417エラーを発生させるためのIIS設定はどうすればよいか(3) | Nomal起動ディスプレイの指定方法について(6) | NomalSystem.Threading.Thread.Sleep()と変数(2) | NomalVisual Studio DataTableの値のアクセスの仕方(2) | NomalDatagridviewのクリア(2) | NomalDataGridView 行の背景色の設定(2) | NomalListBoxにデータが表示されない(6) | NomalPIctureBox同士を論理合成したい(3) | NomalDrawString前のFillRectangle有無により文字の太さが違う理由について教えて下さい(3) | Nomalポルトガル語の登録(5) | NomalnumericUpDwonコントロールのvalue(2) | Nomalデータセット定義ファイルからDataTable(3) | NomalDataTableの構造が同じか調べるメソッド(2) | Nomalネットの画像の複数枚を重ね合わせたい(3) |



■記事リスト / ▼下のスレッド
■34193 / 親記事)  Datagridviewのクリア
□投稿者/ さだきち 一般人(1回)-(2019/03/15(Fri) 22:53:03)
  • アイコン環境/言語:[VB.NET] 
    分類:[.NET] 

    Datagridviewにdatatableをバインドしています。

    内容をクリアするとき
    Datatable.rows.clearするか
    New datatableで新たにテーブルを作成してバインドするか
    どちらのほうが良いでしょうか?

    今見ている仕組みはどちらも混在してるのですが
    前任者がいないためどう使い分けてるのか不明の状態です。
    (使い分けに理由がない可能性もあります)
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34194 / ResNo.1)  Re[1]: Datagridviewのクリア
□投稿者/ 魔界の仮面弁士 大御所(1219回)-(2019/03/18(Mon) 10:20:28)
  • アイコンNo34193に返信(さだきちさんの記事)
    > 内容をクリアするとき
    > Datatable.rows.clearするか
    > New datatableで新たにテーブルを作成してバインドするか
    > どちらのほうが良いでしょうか?

    「何のためにクリアするのか」にもよると思います。

    DataGridView1.AutoGenerationColumn が True/False のいずれなのかとか、
    非バインド列の有無によっても変わってきそうですし、
    まるっきり別の構造のテーブルを割り当てる場合は、
    .Rows.Clear() では十分では無いでしょう。

    列定義が変わるわけでは無いのだとしたら、
    自分ならば、New DataTable() を割り当てなおすことはしないですね。
    DataTable1.Clear() あるいは
    DataTable1.Rows.Clear() にします。

    # .Clear と .Rows.Clear は、.NET 1.x では同じ意味でしたが、
    # .NET 2.0 以降は微妙に実装が異なっています。


    要件によっては、BindingSource で Type を渡すようにするとか、
    DataView でフィルターを変えて見えなくするという事もあるかも。
違反を報告
引用返信
■34198 / ResNo.2)  Re[2]: Datagridviewのクリア
□投稿者/ さだきち 一般人(2回)-(2019/03/22(Fri) 14:42:28)
  • アイコンNo34194に返信(魔界の仮面弁士さんの記事)

    魔界の仮面弁士さま、お返事ありがとうございます。

    改めてソースを見てみると、
    データの内容のみをクリアしているようですが、
    両方の方法が混在しているようです。
    (DataGridViewの書式は保持、非バインド列もなし)

    今後新規で作成する場合は、
    原則clearする方向で検討しようと思います。
    ありがとうございました。


解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34195 / 親記事)  DataGridView 行の背景色の設定
□投稿者/ cb400s2000 一般人(1回)-(2019/03/18(Mon) 20:12:41)
  • アイコン環境/言語:[VB.net SQLServer2008] 
    分類:[.NET] 

    こんばんは。

    visual studio 2010(VB.net) + SQLServerExpress2008を使用しております。

    DataGridViewの背景色の事での質問です。

    タイムカードのデータを表示をしております。
    DataBindをしており、土曜日、日曜日の行の背景色を
    変えたいと思っております。

    DataGridViewのCellFormattingイベントを使用してのサンプルを
    見つけて以下の通り記述をしたのですが、日付を表示している
    列にヒットしないようです。

    If dgv.Columns(e.ColumnIndex).Name = "clmDate" AndAlso _
    typeof e.value is date then

    dim intweekday as integer = weekday(e.value)

    if intweekday = 1 then
    e.cellstyle.backcolor = color.lightpink
    end if
    End if

    そもそも、使用するイベントがおかしいのでしょうか。

    アドバイスをお願いします。
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34196 / ResNo.1)  Re[1]: DataGridView 行の背景色の設定
□投稿者/ Hongliang 大御所(554回)-(2019/03/18(Mon) 21:36:07)
  • アイコン> DataGridViewのCellFormattingイベントを使用してのサンプルを
    > 見つけて以下の通り記述をしたのですが、日付を表示している
    > 列にヒットしないようです。
    とりあえず、dgv.Columns(e.ColumnIndex).Nameとかe.ValueとかをDebug.Printしてみてどんな値が入っているか確認されてみては。
    // その日付列って文字列型だったりしませんよね?

    ところで、
    ・バインドしてるデータの特定の列に日付データが入っていて、
    ・その日付の曜日が土日である行について、
    ・その行の全てのセルの背景色を変更したい、
    という要件でしょうか?
    であれば、CellFormattingイベントでは、
    1. e.RowIndexを元にDataGridView.RowsからDataGridViewRowを取得する
    2. そのDataGridViewRowのDataBoundItemでバインドしているデータの行データを取得する
     ※バインドしているのがDataTableであれば、DataBoundItemはDataRowViewになります。
    3. その行データの日付フィールドの値を見て、条件を満たした場合e.CellStyle.BackColorを変更する
    というだけで十分なはずです。
    ただし、こうした場合に、日付フィールドが変更されうるケースでは、日付フィールドを変更した時に日付セルだけ更新される(その行の他のセルは色が変わらない)ので、DataGridViewのCellEndEditイベントあたりでDataGridViewのInvalidateRowメソッドを呼び出す必要があります。

    日付データのセルだけ背景色を変えたいなら、cb400s2000さんのお書きになっているコードで良いと思います。
    あえて言うなら、曜日の判定は
    Dim dt As DateTime = CType(e.Value, DateTime)
    If dt.DayOfWeek = DayOfWeek.Sunday Then
    のようにやる方が.NET的ではあります。
違反を報告
引用返信
■34197 / ResNo.2)  Re[2]: DataGridView 行の背景色の設定
□投稿者/ cb400s2000 一般人(2回)-(2019/03/20(Wed) 12:02:32)
  • アイコンご回答ありがとうございます。

    ご提示いただいた内容がわからないことが多いので、
    調べながら修正をしてみたいと思います。

    後日、経過をご報告します。
    取り急ぎ、お礼まで。
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34184 / 親記事)  ListBoxにデータが表示されない
□投稿者/ ケミカル 一般人(1回)-(2019/03/07(Thu) 11:46:23)
  • アイコン環境/言語:[c# vs2015] 
    分類:[.NET] 

    ListBox1、ListBox2というListBoxが2つあり、それぞれのDataSourceがDataTableになっています。

    ListBox1.DataSource = dataTable1
    ListBox2.DataSource = dataTable2

    ボタンを押すと、ListBox1に表示されているデータがListBox2に移るようにプログラムを組んでいます。

    お伺いしたいのは、

    dataTable2.cleear();をした後にボタンを押してもListBox2にデータが何も表示されません。
    dataTable2の中身を確認すると、正しくdataTable2に保存されていあました。
    ListBox2にデータが表示されるようにするにはどうしたらいいでしょうか?
違反を報告
引用返信

▽[全レス6件(ResNo.2-6 表示)]
■34186 / ResNo.2)  Re[2]: ListBoxにデータが表示されない
□投稿者/ ケミカル 一般人(2回)-(2019/03/07(Thu) 16:40:43)
  • アイコン
    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);
                    }
                }
            }
        }
    }
    

違反を報告
引用返信
■34187 / ResNo.3)  Re[3]: ListBoxにデータが表示されない
□投稿者/ 魔界の仮面弁士 大御所(1217回)-(2019/03/07(Thu) 17:34:07)
  • アイコン2019/03/08(Fri) 23:35:48 編集(投稿者)

    No34186に返信(ケミカルさんの記事)
    > dataTable2.Rows.Clear(); ではなくdataTable2.Clear(); でした。失礼しました。

    ということは、型付 DataSet であることになりますね。

    <追記>
    ごめんなさい。何か勘違いしていたようです。
    型付きかどうかに関わらず、
     dataTable2.Clear();
     dataTable2.Rows.Clear();
    のいずれの構文も使えるのでした。
    (厳密には異なる処理だが、ほぼ同じ結果になる)
    </追記>


    > 型付DataSetです。

    型付 DataSet ではあるけれど、データの取得には
    TableAdapter を用いておらず、
    DataAdapter を使っているのでしょうか?


    > using (SQLCommand command = new SQLCommand(sql, connection))
    SQLCommand というのは、
    SqlCommand のことでしょうか?
    (System.Data.SqlClient.SqlCommand クラス)



    > 問題になっているのは、追記しました「button3」の箇所でした。

    う〜ん。まだ食い違いがあるような…。

    新たに提示いただいたコードだと、私のコードそのままに、
    > DataTable dataTable2;
    のように、「型付ではない System.Data.DataTable」型の変数が使われています。

    型付 DataSet だというのであれば、変数宣言は
     DataSet1.DataTable1DataTable dataTable1;
     DataSet1.DataTable1DataTable dataTable2;
    のようになるはずですし、インスタンス生成も
     dataTable1 = new DataSet1().DataTable1; // dataTable1.DataSet != null にする場合
     dataTable2 = new DataSet1.DataTable1DataTable(); // dataTable2.DataSet == null にする場合
    などとなっているはず…。


    > //DB接続部分省略
    「adp.Fill(dataTable2);」 の前に dataTable2 をクリアする処理がありませんね。

    手元の環境で試してみましたが、button1 を押さずに button3 を何度も押した場合、
    データが無ければ、listBox2 の内容は変化しません。(増加も減少もしない)

    データが存在していた場合は、ボタンを押すたびに、
    listBox2 の行数がどんどん増えていきました。
    (DataTable に PrimaryKey 制約がある場合は、もちろんエラーになります)


    > dataTable2にはデータは追記されるものの(ブレイクポイントを設定して中身を見ています)、
    > ListBox2には値が表示されませんでした。

    前回の回答の繰り返しになってしまいますが、
    Form1_Load で listBox2.DataSource に割り当てた「dataTable2 変数」が持つインスタンスと、
    button3_Click で adp.Fill した際の「dataTable2 変数」」が持つインスタンスが、
    別のオブジェクトになっている可能性はありませんか?
違反を報告
引用返信
■34189 / ResNo.4)  Re[4]: ListBoxにデータが表示されない
□投稿者/ ケミカル 一般人(3回)-(2019/03/08(Fri) 18:11:29)
  • アイコン
    何度もすいません。実際のコードは下記にあるような感じになっています。
    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;
                            }
                        }
                    }
                }
            }
    }

違反を報告
引用返信
■34190 / ResNo.5)  Re[5]: ListBoxにデータが表示されない
□投稿者/ 魔界の仮面弁士 大御所(1218回)-(2019/03/08(Fri) 22:31:21)
  • アイコン2019/03/08(Fri) 23:23:18 編集(投稿者)

    No34189に返信(ケミカルさんの記事)
    > //普通のDataTable
    > DataTable dataTable1 = new DataTable();
    > //型付データセット
    > DataTable dataTable2 = new DataSet().Table;

    なるほど、データセットクラス名が "DataSet" なんですね。
    ちょっと混乱してしまいました。(^^;

    System.Data 名前空間の DataSet なのか
    WindowsFormsApplication1 名前空間の DataSet なのか
    分かりにくくなるので、混同されないような名前付けをお奨めします


    結論から言えば、最初の回答でも述べた通り、
    『インスタンス管理』に問題があったようです。

    これは要するに、
     example.FillData(dataTable2);
    という操作と
     dataTable2 = example.GetData();
    という操作の違いです。


    前者は、既存の DataTable インスタンスを渡して、
    その器にデータを埋め込んでもらう処理。

    後者はデータの入った新しい DataTable インスタンスを作ってもらい、
    その新しい器を戻り値として受け取る処理です。


    では、提示頂いたコードで見てみましょう。

    > DataTable dataTable1 = new DataTable();
    > DataTable dataTable2 = new DataSet().Table;

    フィールド変数の dataTable1/2 には、new Form1() されたと同時に、
    DataTable のインスタンスが new されて保持されます。
    ここまでは良いですよね?


    > //ListBox2に新しくデータをセットする
    > private void button2_Click_1(object sender, EventArgs e)
    > {
    >  var strSql = @"SELECT * FROM T where col1 = 'Y'";
    >  dataTable2.Clear();
    そしてここで Clear しているのも、同じ器に対する操作です。
    ここまでは問題ありません。


    >  dataTable2 = DoSomething.selectSQL(strSql);
    問題はここ。

    dataTable2 が持っていた古いインスタンスは捨てられて、
    selectSQL から得た別のインスタンスへの参照に置き換えられています。

    この場合は本来、
     var newTbl = DoSomething.selectSQL(strSql);
     dataTable2.Merge(dataTable2, true);
    などとした方が良いでしょう。

    あるいは『DoSomething.FillBySQL(dataTable2, strSql);』となるような
    メソッドを用意するのもお奨めです。



    >  listBox2.DataSource = dataTable2;
    >  listBox2.DisplayMember = "column1";
    > }
    上記のバインド操作は Form1_Load で既に行っていますので、
    本来であれば、あらためてバインドし直す必要はありませんでした。

    しかし現状、再バインドが必要になってしまっているのは、
    同一の器(DataTable インスタンス)を使いまわしているのではなく、
    データを取得するたびに、新しい器を生成してしまっているためです。

    器が変わったので、ListBox のバインド先も切り替えねばならなかったという罠。


    もしも器を使いまわさず、毎回作り直すことを想定しているのなら、
    そもそも事前の Clear は冗長であり無意味です。

     // dataTable2.Clear();
     dataTable2 = DoSomething.selectSQL(strSql);
     listBox2.DataSource = dataTable2;
     listBox2.DisplayMember = "column1";



    個人的には、同じインスタンスを使いまわす実装にすることをお奨めします。
    バインド先を変更すると、ListBox の選択状態もリセットされてしまいますしね。



    > //普通のDataTable
    > DataTable dataTable1 = new DataTable();
    > //型付データセット
    > DataTable dataTable2 = new DataSet().Table;

    ところで上記のコード。

    折角の型付きなのですから、後者は本来
     DataSet.TableDataTable dataTable2 = new DataSet().Table;
    となるものです。

    提示頂いたコードの場合、名前空間を省略せずに記載すると
     global::System.Data.DataTable dataTable1 = new global::System.Data.DataTable();
     global::System.Data.DataTable dataTable2 = new global::WindowsFormsApplication1.DataSet().Table;
     //global::WindowsFormsApplication1.DataSet.TableDataTable dataTable2 = new global::WindowsFormsApplication1.DataSet().Table;
    という意味になり、型付きのメリットが半減してしまいそう。

    現状では、DoSomething 側も型付を意識した設計にはなっていないので、
    型付きではない DataTable で受けるしかなかったのでしょうけれども、
    今回提示した形で修正すれば、型付の方で扱えるようになると思います。
違反を報告
引用返信
■34192 / ResNo.6)  Re[6]: ListBoxにデータが表示されない
□投稿者/ ケミカル 一般人(4回)-(2019/03/11(Mon) 18:21:56)
  • アイコン>var newTbl = DoSomething.selectSQL(strSql);
    >dataTable2.Merge(dataTable2, true);

    dataTable2.Merge(newTbl, true);で解決する事ができました。

    色々と勘違いしていた部分があり勉強になりました。ありがとうございます。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-6]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34177 / 親記事)  PIctureBox同士を論理合成したい
□投稿者/ HIROPON 一般人(1回)-(2019/03/01(Fri) 22:07:14)
  • アイコン環境/言語:[Windows7 VB.NET2017] 
    分類:[.NET] 

    お世話になります。

    VB.NET 2017において、Picturebox同士の画像を論理合成したいのです。
    PictureBox1 = PictureBox1 AND PictureBox2
    みたいな感じです。
    ピクセル1個つづ読み取ってANDして描画してみましたが、速度的に使い物になりませんでした。
    ネットで調べてみましたが、透明色を設定して合成というのはありましたが、色には関係なく全面的に論理処理を行いたいのです。

    よろしくおねがいします。
違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■34179 / ResNo.1)  Re[1]: PIctureBox同士を論理合成したい
□投稿者/ 魔界の仮面弁士 大御所(1213回)-(2019/03/01(Fri) 22:14:09)
  • アイコンNo34177に返信(HIROPONさんの記事)
    > ピクセル1個つづ読み取ってANDして描画してみましたが、速度的に使い物になりませんでした。
    Bitmap.GetPixel / SetPixel メソッドでの書き換えは低速なので、
    大量のピクセルの色を変更する場合は、Bitmap.LockBits メソッドで得た
    BitmapData の Scan0 プロパティに対して読み書きするのが常套手段です。
    https://dobon.net/vb/dotnet/graphics/colorbalance.html#lockbits
    https://dobon.net/vb/dotnet/graphics/drawnegativeimage.html#lockbits
違反を報告
引用返信
■34180 / ResNo.2)  Re[2]: PIctureBox同士を論理合成したい
□投稿者/ HIROPON 一般人(2回)-(2019/03/02(Sat) 18:48:03)
  • アイコンご提示のサンプルを元に以下のようなメソッドを作ってみました。
    ------------------------------------------------------------
    Public Sub AddCopy(ByVal Srcimg As Bitmap, ByVal Desimg As Bitmap)

    '1ピクセルあたりのバイト数を取得する
    Dim SrcpixelFormat As PixelFormat = Srcimg.PixelFormat
    Dim SrcpixelSize As Integer = Image.GetPixelFormatSize(SrcpixelFormat) / 8
    If SrcpixelSize < 3 OrElse 4 < SrcpixelSize Then
    Throw New ArgumentException(
    "1ピクセルあたり24または32ビットの形式のイメージのみ有効です。",
    "Srcimg")
    End If

    Dim DespixelFormat As PixelFormat = Desimg.PixelFormat
    Dim DespixelSize As Integer = Image.GetPixelFormatSize(DespixelFormat) / 8
    If DespixelSize < 3 OrElse 4 < DespixelSize Then
    Throw New ArgumentException(
    "1ピクセルあたり24または32ビットの形式のイメージのみ有効です。",
    "Desimg")
    End If

    'Bitmapをロックする
    Dim SrcbmpDate As BitmapData =
    Srcimg.LockBits(New Rectangle(0, 0, Srcimg.Width, Srcimg.Height),
    ImageLockMode.ReadWrite, Srcimg.PixelFormat)

    If SrcbmpDate.Stride < 0 Then
    Srcimg.UnlockBits(SrcbmpDate)
    Throw New ArgumentException(
    "ボトムアップ形式のイメージには対応していません。",
    "Srcimg")
    End If

    Dim DesbmpDate As BitmapData =
    Desimg.LockBits(New Rectangle(0, 0, Desimg.Width, Desimg.Height),
    ImageLockMode.ReadWrite, Desimg.PixelFormat)

    If DesbmpDate.Stride < 0 Then
    Desimg.UnlockBits(DesbmpDate)
    Throw New ArgumentException(
    "ボトムアップ形式のイメージには対応していません。",
    "Desimg")
    End If

    'ピクセルデータをバイト型配列で取得する
    Dim Srcptr As IntPtr = SrcbmpDate.Scan0
    Dim Srcpixels As Byte() = New Byte(SrcbmpDate.Stride * Srcimg.Height - 1) {}
    System.Runtime.InteropServices.Marshal.Copy(Srcptr, Srcpixels, 0, Srcpixels.Length)

    Dim Desptr As IntPtr = DesbmpDate.Scan0
    Dim Despixels As Byte() = New Byte(DesbmpDate.Stride * Desimg.Height - 1) {}
    System.Runtime.InteropServices.Marshal.Copy(Desptr, Despixels, 0, Despixels.Length)

    'すべてのピクセルの色を補正する
    For y As Integer = 0 To SrcbmpDate.Height - 1
    For x As Integer = 0 To SrcbmpDate.Width - 1
    'ピクセルデータでのピクセル(x,y)の開始位置を計算する
    Dim Srcpos As Integer = y * SrcbmpDate.Stride + x * SrcpixelSize
    Dim Despos As Integer = y * DesbmpDate.Stride + x * DespixelSize

    '新しい色を計算する
    Dim SrcnewR As Integer = Srcpixels(Srcpos + 2)
    Dim SrcnewG As Integer = Srcpixels(Srcpos + 1)
    Dim SrcnewB As Integer = Srcpixels(Srcpos + 0)

    Dim DesnewR As Integer = Despixels(Despos + 2)
    Dim DesnewG As Integer = Despixels(Despos + 1)
    Dim DesnewB As Integer = Despixels(Despos + 0)

    Dim newR As Integer = SrcnewR And DesnewR
    Dim newG As Integer = SrcnewG And DesnewG
    Dim newB As Integer = SrcnewB And DesnewB

    '色を変更する
    Despixels(Srcpos + 2) = CByte(newR)
    Despixels(Srcpos + 1) = CByte(newG)
    Despixels(Srcpos) = CByte(newB)
    Next
    Next

    'ピクセルデータを元に戻す
    System.Runtime.InteropServices.Marshal.Copy(Despixels, 0, Desptr, Despixels.Length)

    'ロックを解除する
    Srcimg.UnlockBits(SrcbmpDate)
    Desimg.UnlockBits(DesbmpDate)

    End Sub
    ------------------------------------------------------------------------
    どうにか思い通りの結果が得られました。
    ありがとうございます。

違反を報告
引用返信
■34191 / ResNo.3)  Re[3]: PIctureBox同士を論理合成したい
□投稿者/ HIROPON 一般人(3回)-(2019/03/08(Fri) 22:32:56)
  • アイコン解決しました!
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-3]



■記事リスト / ▲上のスレッド
■34181 / 親記事)  DrawString前のFillRectangle有無により文字の太さが違う理由について教えて下さい
□投稿者/ Iraquser 一般人(7回)-(2019/03/04(Mon) 17:25:37)
  • アイコン環境/言語:[Win10 c#] 
    分類:[.NET] 

    いつもお世話になっております。
    ピクチャーボックスに文字列を描画する処理で発生する現象の理由が知りたくて
    投稿させて頂きます。
    
    ピクチャーボックスにDrawStringメソッドで文字列を描画する際、描画先となる
    Imageオブジェクトを事前にFillRectangleメソッドにて塗りつぶした後に描画す
    るのと、塗りつぶしをせずに描画するのとで、描画される文字の太さが変わるの
    は何故なんでしょうか。
    
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    namespace Test01 {
        public partial class Form1 : Form {
            public Form1() {
                InitializeComponent();
            }
            private PictureBox p = new PictureBox();
            private void Form1_Load(object sender, EventArgs e) {
                this.Size = new Size(300, 200);
                p.Size = this.ClientSize;
                p.Location = new Point(0, 0);
                p.BackColor = Color.White;
                p.BorderStyle = BorderStyle.FixedSingle;
                p.MouseClick += new MouseEventHandler(p_MouseClick);
                this.Controls.Add(p);
            }
            private void p_MouseClick(object sender, MouseEventArgs e) {
                Bitmap c = new Bitmap(p.Width, p.Height);
                Graphics g = Graphics.FromImage(c);
                Font f = new Font("MS UI Gothic", 20);
                if (e.Button == MouseButtons.Left) {
                    g.FillRectangle(Brushes.White, g.VisibleClipBounds);
                    g.DrawString("左ボタンを押しました。", 
                                 f, Brushes.Black, new Point(20, 20));
                } else if (e.Button == MouseButtons.Right) {
                    g.DrawString("右ボタンを押しました。", 
                                 f, Brushes.Black, new Point(20, 20));
                }
                g.Dispose();
                p.Image = c;
            }
        }
    }
    

592×201 => 250×84
イメージ
1551687937.png
/5KB
違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■34182 / ResNo.1)  Re[1]: DrawString前のFillRectangle有無により文字の太さが違う理由について教えて下さい
□投稿者/ 魔界の仮面弁士 大御所(1214回)-(2019/03/04(Mon) 18:27:55)
  • アイコンNo34181に返信(Iraquserさんの記事)
    > ピクチャーボックスにDrawStringメソッドで文字列を描画する際、描画先となる
    > Imageオブジェクトを事前にFillRectangleメソッドにて塗りつぶした後に描画す
    > るのと、塗りつぶしをせずに描画するのとで、描画される文字の太さが変わるの
    > は何故なんでしょうか。

    g.DrawString を呼ぶ前に、g.TextRenderingHint に
    SystemDefault(=0) 以外の値をセットしてみてください。
違反を報告
引用返信
■34183 / ResNo.2)  Re[1]: DrawString前のFillRectangle有無により文字の太さが違う理由について教えて下さい
□投稿者/ 魔界の仮面弁士 大御所(1215回)-(2019/03/05(Tue) 07:22:16)
  • アイコンNo34181に返信(Iraquserさんの記事)
    > 描画される文字の太さが変わるの
    > は何故なんでしょうか。

    OS の ClearType 設定にも依存します。

    http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=21802
違反を報告
引用返信
■34188 / ResNo.3)  Re[2]: DrawString前のFillRectangle有無により文字の太さが違う理由について教えて下さい
□投稿者/ Iraquser 一般人(9回)-(2019/03/08(Fri) 07:37:31)
http://Win10 c#
  • アイコンNo34183に返信(魔界の仮面弁士さんの記事)
    魔界の仮面弁士さん、いつもお世話になっています。
    お礼の返信が遅れてしまい申し訳ありません。返信した積りだったんですが、)投稿されてませんでした(私の操作ミスと思います)。
    TextRenderingHint、対応して思い通りの結果が得られる事を確認しました。
    ClearTypeに関しては、開発環境を触る事は少々難しいんで、プライベートで試してみようと思っています。
    有難うございました。

解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-3]






Mode/  Pass/


- Child Tree -

2020/12/02(Wed) 21:20:06 に作成されたキャッシュを表示しています。
生のデータを表示する | キャッシュを最新にする