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

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

記事リスト ( )内の数字はレス数
Nomalフォントに登録されていない文字の検出(1) | Nomaloledbでdatatableを取得するときにエラーになる(1) | NomalDataGridViewの複数行選択で歯抜け選択を無効にしたい(2) | Nomal証券会社へのログイン(1) | Nomalユーザーフォームに埋め込んだAutoCADの変化を捉える(0) | Nomalシステムドライブ以外へのページング設定が反映されない(5) | Nomalブラウザでコピーした透過PNGを貼り付けたい(4) | Nomalforeachでループ回数を取得(2) | Nomalbitmapが保存できない(2) | Nomal特定ピクセルで画像を読み込みたい(2) | NomalDataGridViewでAlt+Enterで改行したい(2) | Nomal全角シフト中にアクセスキーが効かない(5) | NomalDataAdapter.Updateで構文エラー(6) | Nomal抽象クラスで実装したクラスの情報を知る(3) | NomalProcessクラスからbatファイル実行後、KILLできない(2) | Nomal画面遷移(モーダルとモードレス)(2) | Nomal兆億万表記の文字列を数値に変換できる?(3) | NomalGetDirectoriesでルートを指定するとエラーになる(3) | NomalLinqにおける明示的型指定の方法(3) | Nomal2つのradの数値から1つの角度を求めるコードを改善できますか?(C++)(2) | Nomalコンソールアプリで、WebView2の利用(2) | NomalEntity Frameworkは、使えるか?(2) | Nomalデータベースからのテーブル名一覧の効率的な取得方法(3) | NomalC#のlong型でオーバーフローになる(2) | Nomal正規表現のパターン表記方法(2) | NomalWebView2によるスクレ―ピング(4) | Nomalこういた物を作れますか?(2) | Nomalツールボックスにtableadapterが表示されない(1) | NomalC# Chart X軸上のグラフ表示(3) | NomalVB.NETでBluetoothデバイスの電池残量を取得する方法(3) | Nomalクリスタルレポート 明細部のサブレポート(0) | Nomal重なったPictureBox同士を透過する方法(7) | NomalWindowsフォームデザイナについて(3) | NomalVB.NETからcmdでpingを実行した時の結果(5) | Nomalvb.netでExcelファイル操作(7) | Nomalvb.netでのExcelファイルそうさ(2) | Nomalキーボード+バーコードでキーボード入力を無効にしたい(6) | Nomalファイルとして配置したマニフェストを優先したい(2) | NomalTabPageの背景色(5) | NomalVB2022でクリスタルレポートが開けない(2) | NomalC#でJpeg圧縮のTiffファイルを作成したい(4) | Nomalエクセルのみ監視ができない(2) | NomalDataGridViewのVirtualModeを有効した場合の実装方法(4) | NomalExcelの数値 -> 日付みたいな関数?(2) | NomalDrawstringでの透過文字作成(3) | Nomaljumbo icon(256x256)が存在するか知る方法(6) | NomalSpinWait()を使う理由(2) | Nomalantecedentってなんですか?(2) | Nomalワンタイムパスワードのサイトに自動ログインしてアクセストークンを得る(3) | Nomalstyle.displayだと効率悪いから違うやり方をしたいです。(5) | Nomalテーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。(4) | NomalJSONの複雑な入れ子内部の値を取りたい。(3) | Nomalグリッド表示レコードをJSONに変換(5) | Nomalシステム時計の設定(3) | NomalSeleniumで開いているページのTableを編集したい(5) | Nomalソケット通信入門 ひらがな(4) | NomalVisual Basicでエラーが出る(3) | Nomalインストーラにて、ローミングフォルダにファイルを配置したい(0) | NomalRGB値の所得(2) | NomalVB.net からAccessDBへの接続(2) | Nomal時間変数(文字列)の扱い(4) | Nomal画像のスクロール(6) | Nomalタイマーの一括処理(6) | NomalTreeViewとDataGridViewのスクロールを同期(シンクロ)させたい(4) | NomalTreeViewの現在位置とDataGridViewの現在位置を合わせたい(7) | Nomalフォームのリサイズ時にDataGridViewが再描画されない(4) | NomalPDFをフォーム上で表示させる方法につきまして(4) | NomalPictureBoxの画像を連続保存(11) | NomalテキストボックスのValidatingイベントよりも先に発生するボタン発生イベントは何でしょう?(2) | Nomal継承元フォームで各フォームのボタン動作を検知したい(3) | NomalWindowsエクスプローラからのドラッグ&ドロップ(2) | Nomalラジオボタンの一括設定(7) | Nomalクリックイベントでexeを作成できるか(2) | Nomal作成した白黒画像をWordに貼り付けてから「図として保存」(8) | Nomalアセンブリ情報が載らない(1) | NomalRichTextBoxのテキストをpictureBOXへ(12) | Nomalc#で日付型の定義の仕方で質問があります。(2) | Nomal先頭に空白(スペース)があるファイルを読み込んでRichTextBoxへ書き出すとスペースが削除える(6) | NomalExcel Com オブジェクトの増殖(13) | Nomal二次元マップから値の取得(1) | NomalアプリでHDMIへ出す解像度を変えたい(4) | NomalDataGridViewのドロップダウンリストの表示と選択後の値を分けたい(1) | Nomal列車の時間ごとの位置情報を表示したいです。(2) | Nomal画像の中心を基点に回転(4) | NomalDataGridViewの行ヘッダーに行番号を表示した時のエラー(4) | NomalタッチキーボードでIMEを自動で切替えたい(6) | NomalVSTOによるエクセルアドインのインストーラーでのアップデート(1) | NomalMP4動画を再生する方法について(5) | NomalVB.NetでVB6.0と同じFontを指定しても同様に印刷されない(9) | NomalLabelで文字単位の背景色(7) | NomalLableのカラー色を文字変数から変更したい(5) | NomalUrlにアクセスするとダウンロードされるファイルを捕まえる(2) | Nomalタブレット等でスワイプによるスクロールを実装(2) | NomalTEXTBOXのプロパティを文字列に(7) | NomalPDFをフォーム上で表示させる方法につきまして(6) | NomalChart X軸上の描画を切り替えたい(0) | NomalRichTextBoxへのドラッグ&ドロップしたExcelファイルの扱い(3) | Nomal特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因(6) | NomalDataGridViewの特定セルにボタンを配置する方法(5) |



■記事リスト / ▼下のスレッド
■35596 / 親記事)  DataGridViewでAlt+Enterで改行したい
□投稿者/ aks 一般人(1回)-(2024/04/08(Mon) 20:13:16)
  • アイコン環境/言語:[.NET Framework4.8 C# Windows10 VS2022 ] 
    分類:[.NET] 

    お世話になります。
    
    DataGridViewで、エクセルのようにセルをAlt+Enterで改行させる事は可能でしょうか?
    Shift+Enterで改行しないように実装はできましたが、先に進めず困っておりましてご教授願います。
    よろしくお願いいたします。
    
    
    //DataGridViewの派生クラスを作成
    //デザイナーでtextboxの列を1つ追加済み。
    public class DataGridView_Kai : DataGridView
    {
        protected override bool ProcessCmdKey(ref Message msg, Keys KeysVal)
        {
            //Shift+Enterの同時押しを無効化
            if ((KeysVal & Keys.KeyCode) == Keys.Enter && (KeysVal & Keys.Modifiers) == Keys.Shift)
            {
                return true;
            }
    
            //Alt+Enterの同時押下時に改行。。。
            if ((KeysVal & Keys.KeyCode) == Keys.Enter && (KeysVal & Keys.Modifiers) == Keys.Alt)
            {
                  //テストでKeysValを0にしても、下のセルへ移動しますので、実装場所が違うのではないかと考えております。
    
            }
    
            return base.ProcessCmdKey(ref msg, KeysVal);
        }
    }
    
    public partial class Form1 : Form
    {
    
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView_Kai1.DefaultCellStyle.WrapMode  = DataGridViewTriState.True;
    
            dataGridView_Kai1.RowCount = 10;
        }
    }
    

違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35597 / ResNo.1)  Re[1]: DataGridViewでAlt+Enterで改行したい
□投稿者/ KOZ 一般人(35回)-(2024/04/09(Tue) 00:38:33)
  • アイコン
    2024/04/10(Wed) 05:38:01 編集(投稿者)
    
    ■No35596に返信(aksさんの記事)
    > DataGridViewで、エクセルのようにセルをAlt+Enterで改行させる事は可能でしょうか?
    
    こんな感じでしょうか?
    
    public class DataGridView_Kai : DataGridView
    {
        protected override bool ProcessCmdKey(ref Message msg, Keys KeysVal) {
            if (IsCurrentCellInEditMode) {
                TextBox textBox = EditingControl as TextBox;
                if (textBox != null && textBox.Multiline) {
                    switch (KeysVal) {
                        case Keys.Enter | Keys.Shift:
                            return true;
                        case Keys.Enter | Keys.Alt:
                            string newLine = Environment.NewLine;
                            if (textBox.MaxLength == 0 ||
                                textBox.TextLength - textBox.SelectionLength + newLine.Length <= textBox.MaxLength) {
                                textBox.SelectedText = newLine;
                            }
                            return true;
                    }
                }
            }
            return base.ProcessCmdKey(ref msg, KeysVal);
        }
    }
    

違反を報告
引用返信
■35598 / ResNo.2)  Re[2]: DataGridViewでAlt+Enterで改行したい
□投稿者/ aks 一般人(2回)-(2024/04/13(Sat) 14:17:57)
  • アイコンKOZ様

    ご回答いただきありがとうございます。
    教えていただいた内容で試したところ解決しております。

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

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35589 / 親記事)  全角シフト中にアクセスキーが効かない
□投稿者/ うえし 一般人(1回)-(2024/03/20(Wed) 07:48:08)
  • アイコン環境/言語:[.NET Framework4.6、 VB.NET、 VisuleStudio2019] 
    分類:[.NET] 

    .NET FrammeWork4.6でVB.NETの開発をしています。
    MenuStrip上のアイテムに設定したアクセスキーが、半角シフトの状態では正常に反応しますが、全角シフトの状態では全く反応しません。
    市販のソフトに設定されているアクセスキーは正常に反応します。
    また、念のため新しいプロジェクトを作り直して試してみましたが、矢張り全角シフト状態でアクセスキーは効きませんでした。
    アクセスキーの組み込みはネットに数多く掲載されている方法に従っていますので、その方法に間違いはありません。
    何故、全角シフトの状態ではアクセスキーが反応しないのか、原因をお分かりの方は教えてください。よろしくお願いいたします。

違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■35591 / ResNo.1)  Re[1]: 全角シフト中にアクセスキーが効かない
□投稿者/ KOZ 一般人(32回)-(2024/03/21(Thu) 10:20:42)
  • アイコン
    2024/03/21(Thu) 11:02:37 編集(投稿者)
    
    ■No35589に返信(うえしさんの記事)
    > MenuStrip上のアイテムに設定したアクセスキーが、半角シフトの状態では正常に反応しますが、全角シフトの状態では全く反応しません。
    > 市販のソフトに設定されているアクセスキーは正常に反応します。
    
    メモ帳などで使われているメニューと、MenuStrip は別物です。
    .NET には MainMenu というものがあります。
    古い時代のものですから、拡張性がなく、今ではデザイナのツールボックスからも消えてしまいました。
    次の様なコードで使用できます。
    
    Public Class Form1
    
        Public Sub New()
            InitializeComponent()
            Dim mainMenu As New MainMenu
            Dim fileMenu As New MenuItem("ファイル(&F)")
            Dim exitMenuItem As New MenuItem("終了(&X)")
            fileMenu.MenuItems.Add(exitMenuItem)
            mainMenu.MenuItems.Add(fileMenu)
            Me.Menu = mainMenu
            AddHandler exitMenuItem.Click, AddressOf exitMenuItem_Click
        End Sub
    
        Private Sub exitMenuItem_Click(sender As Object, e As EventArgs)
            Close()
        End Sub
    
    End Class
    
    .NET Core 3.1 以降、使えなくなりますので、使わないほうがいいと思います。

違反を報告
引用返信
■35592 / ResNo.2)  Re[2]: 全角シフト中にアクセスキーが効かない
□投稿者/ うえし 一般人(4回)-(2024/03/21(Thu) 16:55:41)
  • アイコン全角シフト中はアクセスキーを使えないということは、正しい仕様なのでしょうか?


違反を報告
引用返信
■35593 / ResNo.3)  Re[3]: 全角シフト中にアクセスキーが効かない
□投稿者/ KOZ 一般人(33回)-(2024/03/21(Thu) 18:04:21)
  • アイコンNo35592に返信(うえしさんの記事)
    > 全角シフト中はアクセスキーを使えないということは、正しい仕様なのでしょうか?

    正しい仕様かどうかはわかりません。
    が、そういうものだと思って使うしかないでしょう。


違反を報告
引用返信
■35594 / ResNo.4)  Re[4]: 全角シフト中にアクセスキーが効かない
□投稿者/ KOZ 一般人(34回)-(2024/03/21(Thu) 18:51:01)
  • アイコンちなみに、私の環境だと、かな入力のときだけ問題が発生します。
    ローマ字入力だと使えるので不具合かもしれません。

    Visual Studio には問題を報告する機能があります。(とはいえリンクに飛ぶだけですが)
    https://learn.microsoft.com/ja-jp/visualstudio/ide/how-to-report-a-problem-with-visual-studio?view=vs-2022

    報告したら修正してくれるかも?
違反を報告
引用返信
■35595 / ResNo.5)  Re[5]: 全角シフト中にアクセスキーが効かない
□投稿者/ うえし 一般人(5回)-(2024/03/22(Fri) 06:18:42)
  • アイコン私の環境でも、ローマ字入力の場合は大丈夫でした。
    かな入力の場合だけ問題が発生するようですね。
    ありがとうございました。
解決み!
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35582 / 親記事)  DataAdapter.Updateで構文エラー
□投稿者/ けい 一般人(11回)-(2024/03/11(Mon) 20:33:55)
  • アイコン環境/言語:[Windows10、VB.NET2022 ACCESS(Microsoft365)] 
    分類:[.NET] 

    お世話になります。

    Windows10、VB.NET2022で開発しています。

    ACCESSのテーブルAがあり、
    フィールドは[ID](主キー)と[フィールドP]とします。

    ソフトで、テーブルA全体のデータセットをSELECT文で取得し、
    1行ずつ、[フィールドP]を「値」で更新する処理を書いています。

    まずFor〜Nextループの中で、UPDATE文を使用してみます。

    Try〜Catch〜Finally、トランザクションはここでは省略します。

    System.Data.OleDb Ver8.0.0は、
    NuGetでインストール済です。

    -------------------------------------
    Private Sub TEST()
    Using cn As New OleDb.OleDbConnection(接続文字列)

    Dim da As OleDb.OleDbDataAdapter
    Dim ds As DataSet
    Dim dt As DataTable
    Dim dr() As DataRow
    Dim i As Integer
    Dim cmd As OleDbCommand

    Dim strSelect As String
    Dim strUpdate As String

    strSelect = "select * from [テーブルA]"
    da = New OleDbDataAdapter(strSelect, cn)
    ds = New DataSet
    da.Fill(ds, "テーブルA")
    dt = ds.Tables("テーブルA")
    dr = dt.Select

    For i = 0 To dr.Length - 1
    strUpdate = "update [テーブルA]" &
    " set [フィールドP]=[値] where [ID]=" & dr(i)("ID") & ""
    cmd = New OleDbCommand
    cmd.Connection = cn
    cmd.CommandText = strUpdate
    cmd.ExecuteNonQuery()
    Next

    End Using

    End Sub
    -------------------------------------

    この書き方ですと、更新処理は成功しますが、
    すでにテーブルAの特定行における処理をしている中で、
    UPDATE文のWHEREで再度同じ行を検索するような書き方になっています。

    なので、ここではDataAdapter.Updateの書き方で書きたいです。
    下記のように書いてみました。

    -------------------------------------
    Private Sub TEST()
    Using cn As New OleDb.OleDbConnection(接続文字列)

    Dim da As OleDb.OleDbDataAdapter
    Dim ds As DataSet
    Dim dt As DataTable
    Dim dr() As DataRow
    Dim cb As OleDbCommandBuilder
    Dim i As Integer
    Dim strSelect As String

    strSelect = "select * from [テーブルA]"

    da = New OleDbDataAdapter(strSelect, cn)
    ds = New DataSet
    da.Fill(ds, "テーブルA")
    dt = ds.Tables("テーブルA")
    dr = dt.Select

    cb = New OleDbCommandBuilder(da)

    For i = 0 To dr.Length - 1
    dr(i).BeginEdit()
    dr(i)("フィールドP") = [値]
    dr(i).EndEdit()
    Next

    da.Update(ds, "テーブルA")・・・※

    End Using

    End Sub
    -------------------------------------

    こちらですと、※の部分で構文エラーが出ます。

    ※をFor〜Nextループの中においても、エラーでした。

    BeginEdit、EndEditを外してもエラーです。

    以前VB.NET2012で開発していた際には、
    この書き方で更新処理ができたと思うのですが、
    おかしな部分がございますでしょうか。

    どうぞよろしくお願い申し上げます。

違反を報告
引用返信

▽[全レス6件(ResNo.2-6 表示)]
■35584 / ResNo.2)  Re[2]: DataAdapter.Updateで構文エラー
□投稿者/ けい 一般人(12回)-(2024/03/12(Tue) 10:26:48)
  • アイコンNo35583に返信(KOZさんの記事)

    KOZさま、できました!
    ありがとうございます!
    ループ中でこれを行う場合は、
    この文言が必要になりますかね。
    助かりました!

    > ■No35582に返信(けいさんの記事)
    >
    > cb = New OleDbCommandBuilder(da)
    > cb.QuotePrefix = "["
    > cb.QuoteSuffix = "]"
    >
    > これでうまくいかないでしょうか?
解決み!
違反を報告
引用返信
■35585 / ResNo.3)  Re[1]: DataAdapter.Updateで構文エラー
□投稿者/ 魔界の仮面弁士 大御所(1570回)-(2024/03/12(Tue) 10:31:36)
  • アイコンNo35582に返信(けいさんの記事)
    > ソフトで、テーブルA全体のデータセットをSELECT文で取得し、
    > 1行ずつ、[フィールドP]を「値」で更新する処理を書いています。
    それはあまり一般的なやり方では無いですね…。今回やろうとしているように、
    DataAdapter か TableAdapter を使う方が手っ取り早いでしょうね。

    仮にループ内で処理するにしても、今のように毎回 OleDbCommand を発行して、
    ad-hoc な SQL をその都度作るようなコードは避けるべきです。ループ処理なら
    OleDbCommand のインスタンス化はループの外で一度だけ行うようにし、
    ループ内では更新値を OldDbParameter で受け渡して、ExecuteNonQuery を
    呼び出すだけのコードにします。


    > System.Data.OleDb Ver8.0.0は、
    > NuGetでインストール済です。
    ということは .NET Framework のプロジェクトではなく、.NET 8 なのですね?


    > こちらですと、※の部分で構文エラーが出ます。
    それは、Visual Basic の構文エラー(コンパイルエラー)では無く、
    JET Database Engine の構文エラー(実行時エラー)なのですよね?

    であれば、実際のエラー内容を公開すべきだと思いますよ。

    何が原因になっているのかは、実際の構文を見てみないと分かりませんが、
    Access 絡みの更新失敗時に良く事故として、たとえばこういったものがあります。

    ・PRIMARY KEY や UNIQUE KEY が無く、更新行を特定可能な SQL コマンドを生成できなかった
     ⇒ 主キーを追加する

    ・フィールド名に予約語が使われており、構文解析に失敗した … NO, DATE など
    ・半角カナや長音記号「ー」など、実行環境によって正しく処理されないフィールド名がある
     ⇒ QuotePrefix / QuoteSuffix を補完する

    ・時刻を持つ日付型フィールドがあるが、UpdateCommand プロパティの該当 Parameter が、
     DbType.DateTime ではなく DbType.Date にマッピングされていて、更新元行の検出に失敗していた
     ⇒ パラメーターの DbType を修正する


    まずは、自動生成される更新クエリの内容を確認するため、
     cb = New OleDbCommandBuilder(da)
    の実行直後に、このようなコードを書いて、正しい更新コマンドが得られているかを確認しましょう。

     da.UpdateCommand = cb.GetUpdateCommand()
     Debug.Print($"{da.UpdateCommand.CommandText}")
     For Each p As OleDbParameter In da.UpdateCommand.Parameters
       Debug.Print($" [{p.ParameterName}], Col=[{p.SourceColumn}], Ver={p.SourceVersion}, DB型={p.OleDbType}, VB型={p.DbType}, Size={p.Size}")
     Next

    なお、元の SQL に近づけるのであれば、
     cb.ConflictOption = ConflictOption.OverwriteChanges
     cb.QuotePrefix = "["
     cb.QuoteSuffix = "]"
    を加えておいた方が良いかもしれませんが、この辺りは任意で。



    > Dim i As Integer
    ループカウンタのような局所的な変数を、コードの先頭で事前宣言すべきではありません。

    VB.NET 2002 といった古いバージョンならいざ知らず、2003 以降では
     For i As Integer = 0 To dr.Length - 1
    のようにして、For 内でしか使われない、ブロック スコープの変数にすべきです。
    (VB2008 以降では、For i As Integer = 0 ではなく For i = 0 と書くのが一般的)

    https://thom.hateblo.jp/entry/2016/12/12/223708
    https://learn.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/language-features/declared-elements/scope?WT.mc_id=DT-MVP-8907
違反を報告
引用返信
■35586 / ResNo.4)  Re[2]: DataAdapter.Updateで構文エラー
□投稿者/ けい 一般人(13回)-(2024/03/12(Tue) 11:43:17)
  • アイコンNo35585に返信(魔界の仮面弁士さんの記事)

    魔界の仮面弁士様、
    ありがとうございます!

    上記UPDATE文を使うほうでは、
    cmd = New OleDbCommand
    cmd.Connection = cn
    をForループの前に置きます。

    更新値は、
    実際には、
    このForループの中において、
    また別のテーブルをSELECT検索し取得するため、
    UPDATE文を毎度代入しなおしています。
    この部分をOleDbParameterでできるかどうか、
    考えてみます。

    System.Data.Oledbは、
    VB.NET2012を使用していたころは、
    Importsしていました。
    VB.NET2022では、Importsでは利用できないとわかり、
    方法を調べて、
    NuGetパッケージとしてインストールしました。
    ですので、自分の中では、プロジェクト自体は.NEY Frameworkだと思っております。.NET8はダウンロードしておりません(詳しくありません)。

    ※の部分でのエラーは、
    Syntax error in Update Statement.
    でした。
    テーブルAの主キーの実際の名称に「No」が入っておりました。
    これを変更しました。
    cb.QuotePrefix = "["
    cb.QuoteSuffix = "]"
    を加えなくてもエラーが出なくなりました。


    更新コマンド内容、確認します。

    Dim i As Integerの行を削除しました。
    For i =0
    の記述はありますが、
    これでもうまくいくのですね。

    ご教示をいただき、ありがとうございます!




違反を報告
引用返信
■35587 / ResNo.5)  Re[3]: DataAdapter.Updateで構文エラー
□投稿者/ 魔界の仮面弁士 大御所(1571回)-(2024/03/12(Tue) 14:40:02)
  • アイコンNo35586に返信(けいさんの記事)
    > テーブルAの主キーの実際の名称に「No」が入っておりました。

    Access には、「Yes/No型」という Boolean 相当のデータ型があるため、
    「No」が予約語になっています。できれば、フィールド名に予約語を採用しないことをお奨めします。


    > Dim i As Integerの行を削除しました。
    > For i =0
    > の記述はありますが、
    > これでもうまくいくのですね。

    VB.NET 2002 までは
     Dim i As Integer
     For i = 0 To 10
    のように、事前に変数宣言が必須でした。

    VB.NET 2003 からは
     For i As Integer = 0 To 10
    のように書くことで、For ブロックのみで有効な「局所変数」を作れるように進化しました。
    https://atmarkit.itmedia.co.jp/fdotnet/special/vs2003/vs2003_04.html


    その後、VB2008 の時代になって「型推論」という機構が生まれ、
     Dim i As Integer = 123
     Dim s As String = "abc"
    といった、変数宣言時に初期値を指定しているコードでは、As 句を省略して
     Dim i = 123
     Dim s = "abc"
    と書いても良いことになりました。この機能があるおかげで、今では
     For i = 0 To 10
    と書いただけで、(事前に Dim i As Integer 無しで)局所変数 i として認識されるようになっています。



    > System.Data.Oledbは、
    > VB.NET2012を使用していたころは、
    > Importsしていました。

    勘違いがあるようですが、「Imports」という機能は参照設定 や NuGet とは別物です。

    プロジェクトから使うには、依存アセンブリを参照設定 もしくは NuGet するなどして
    プロジェクト内から参照しておく必要があるのはご存知の通り。

    一方、それらの機能をコードから呼び出すために
     Imports System.Data
     Imports System.Data.OleDb
    などと書いていたかと思いますが、こちらは必須作業ではありません。

    そもそも Imports ステートメントというのは、
     'Dim adp As New Global.System.Data.OleDb.OleDbDataAdapter()
     Dim adp As New System.Data.OleDb.OleDbDataAdapter()
     'Global.System.Windows.Forms.MessageBox.Show("TEST")
     System.Windows.Forms.MessageBox.Show("TEST")
    といった、名前空間付きの長い型指定を簡略化して、
     Dim cn As New OleDbConnection()
     MessageBox.Show("TEST")
    のように、名前空間を省略してクラス名だけで短く表記するための仕組みに過ぎません。参照設定とは別物です。

    なお、この Imports は、.vb のファイルの先頭に個別に書く方法の他、
    プロジェクト全体に対して一括設定することもできます。

    一括設定するには場合は、プロジェクトのプロパティから、
     ★ [参照設定]タブ > [インポートされた名前空間]
     ☆ [参照]>[全般] ノード > [名前空間のインポート]
    のいずれかで指定します(★は .NET Framework の場合、☆ は .NET の場合です)。

    既定では System.Data 名前空間がインポート済みですが、
    System.Data.OleDb 名前空間はインポートされていないので、ここで追加してもOK。


    そして System.Data.OleDb 名前空間のクラスは、
     .NET Framework では、System.Data.dll というアセンブリに
     .NET では System.Data.OleDb.dll というアセンブリ(System.Data.OleDb v8.0.0 パッケージ)
    に含まれています。

    下記ドキュメント冒頭の「アセンブリ」欄をご覧ください。
    前者は "System.Data.dll" で
    後者は "System.Data.OleDb.dll" になっていますよね。
    このように、名前空間とアセンブリ名は一致しないこともあることに注意しましょう。
    https://learn.microsoft.com/ja-jp/dotnet/api/system.data.oledb.oledbconnection?WT.mc_id=DT-MVP-8907&view=netframework-4.8.1
    https://learn.microsoft.com/ja-jp/dotnet/api/system.data.oledb.oledbconnection?WT.mc_id=DT-MVP-8907&view=dotnet-plat-ext-8.0&viewFallbackFrom=net-8.0


    そして System.Data.dll は通常、標準で有効化されておりますので、
    .NET Framework をお使いなのであれば、アセンブリ参照を追加する必要はないはずです。



    > ですので、自分の中では、プロジェクト自体は.NEY Frameworkだと思っております。.NET8はダウンロードしておりません(詳しくありません)。

    NuGet から得られる System.Data.OleDb 8.0 は .NET Standard 2.0 向けですので、
    .NET Framework でも使えますが、その場合、ターゲット フレームワークを 4.6.2 以上にしてください。

    .NET Framework 3.5 や 4.5.2 といった古いバージョンの場合は、NuGet 参照せずに
    .NET Framework に標準で組み込まれている物をそのまま使いましょう。



    なお、WinForms アプリの場合、新規作成する際のプロジェクト テンプレートにおいて
     ★Windows フォーム アプリケーション ⇒ 既定のプロジェクト名:WindowsApp1
     ☆Windows フォーム アプリ      ⇒ 既定のプロジェクト名:WinFormsApp1
    というよく似た名前のプロジェクトがあるので、注意が必要です。
    前者は .NET Framework 専用、後者は .NET のためのプロジェクトです。

    前者の場合、最初の画面で .NET Framework のフレームワーク バージョンを選択する画面が表示されます。
    後者の場合、2 番目の画面で .NET のフレームワーク バージョンを選択する画面が表示されます。
違反を報告
引用返信
■35588 / ResNo.6)  Re[4]: DataAdapter.Updateで構文エラー
□投稿者/ けい 一般人(14回)-(2024/03/13(Wed) 14:00:26)
  • アイコンNo35587に返信(魔界の仮面弁士さんの記事)

    お詳しくご説明いただきまして、
    まことにありがとうございます。

    Windowsフォームアプリケーションで作成するところを、
    Windowsフォームアプリで作成しておりました。

    いただきました内容をもとに、
    精進させていただきます。

    まことにありがとうございました。

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

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35578 / 親記事)  抽象クラスで実装したクラスの情報を知る
□投稿者/ 夏風 一般人(1回)-(2024/02/20(Tue) 08:27:18)
  • アイコン環境/言語:[C#] 
    分類:[.NET] 

    はじめまして、夏風といいます。

    現在、DOBONさんの「オブジェクトの内容をファイルに保存、復元する
    オブジェクトのXMLシリアル化、逆シリアル化を行う」(https://dobon.net/vb/dotnet/file/xmlserializer.html)の記事を見ながら、抽象化クラスとして定義できないかと思っています。
    その中で、抽象化クラス側で実装クラスの型や実装クラスへのキャストの仕方がわからなく困っています。

    具体的には、
    >//XmlSerializerオブジェクトを作成
    > //オブジェクトの型を指定する
    > System.Xml.Serialization.XmlSerializer serializer =
    > new System.Xml.Serialization.XmlSerializer(typeof(SampleClass));
    のtypeof(SampleClass)の部分と
    > //XMLファイルから読み込み、逆シリアル化する
    > SampleClass obj = (SampleClass)serializer.Deserialize(sr);
    の(SampleClass)の部分をどうすればいいかわかりません。

    そもそも、抽象クラス側でこのようなことをすること自体が間違っているのでしょうか?
違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■35579 / ResNo.1)  Re[1]: 抽象クラスで実装したクラスの情報を知る
□投稿者/ 魔界の仮面弁士 大御所(1569回)-(2024/02/20(Tue) 11:51:36)
  • アイコンNo35578に返信(夏風さんの記事)
    > 抽象化クラス側で実装クラスの型や実装クラスへのキャストの仕方がわからなく困っています。

    意図を理解できているか自信がありませんが、こういうことで良いのかな。


    public class SampleClass : SampleClassBase
    {
      public DateTime TimeStamp;
    }
    public class SampleClass2 : SampleClass { }

    public static class SampleClassBaseExtensions
    {
      public static T LoadFromFile<T>(this T @this, string fileName) where T : SampleClassBase => SampleClassBase.LoadFromFile<T>(fileName);
    }
    public abstract class SampleClassBase
    {
      public int Number;
      public string Message;

      public void SaveToFile(string fileName)
      {
        using (var sw = new System.IO.StreamWriter(fileName, false, new System.Text.UTF8Encoding(false)))
        {
          var serializer = new System.Xml.Serialization.XmlSerializer(GetType());
          serializer.Serialize(sw, this);
          sw.Close();
        }
      }

      public static T LoadFromFile<T>(string fileName) where T : SampleClassBase
      {
        using (var sr = new System.IO.StreamReader(fileName, new System.Text.UTF8Encoding(false)))
        {
          var serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));
          var obj = (T)serializer.Deserialize(sr);
          sr.Close();
          return obj;
        }
      }
    }

    class MainClass
    {
      public static void Main()
      {
        string fileName = @"C:\test\sample.xml";

        SampleClass obj0 = new SampleClass { Message = "テストです。", Number = 123, TimeStamp = DateTime.Now };

        // <SampleClass>〜</SampleClass> な XML として保存される
        obj0.SaveToFile(fileName);

        // <SampleClass> な XML を SampleClass 以外の型に復元することはできない
        // var obj1 = SampleClassBase.LoadFromFile<SampleClassBase>(fileName);
        // var obj2 = SampleClassBase.LoadFromFile<SampleClass2>(fileName);

        // これらは正しい型なので復元できる
        SampleClass obj3 = SampleClassBase.LoadFromFile<SampleClass>(fileName);
        SampleClass obj4 = obj0.LoadFromFile(fileName);

        // SampleClass のインスタンスとして復元してから、SampleClassBase 型の変数に入れるのは OK
        SampleClassBase obj5 = SampleClassBase.LoadFromFile<SampleClass>(fileName);
        SampleClassBase obj6 = obj0.LoadFromFile(fileName);
      }
    }
違反を報告
引用返信
■35580 / ResNo.2)  Re[1]: 抽象クラスで実装したクラスの情報を知る
□投稿者/ とくま 一般人(4回)-(2024/02/20(Tue) 21:37:29)
  • アイコン
    No35578に返信(夏風さんの記事)
    数年前、同じようなこと考えて色々作り込んだ後、ジェネリックの部分だけ
    あれば事足りるんじゃないかという結論になったことがある。。。
        class MainClass
        {
            public static void Main()
            {
                const string strBasePath = @"C:\test\";
                string strForm1XML = Path.Combine(strBasePath, @"Form1Setting.xml");
                string strForm2XML = Path.Combine(strBasePath, @"Form2Setting.xml");
    
                clsGenericsTest<clsForm1Setting> obj1 = new clsGenericsTest<clsForm1Setting>(strForm1XML);
                clsForm1Setting objSaveItem1 = new clsForm1Setting();
                objSaveItem1.TimeStamp = DateTime.Now;
                obj1.SaveFile(objSaveItem1);
    
                clsGenericsTest<clsForm2Setting> obj2 = new clsGenericsTest<clsForm2Setting>(strForm2XML);
                clsForm2Setting objSaveItem2 = new clsForm2Setting();
                objSaveItem2.TimeStamp = DateTime.Now.AddDays(10);
                obj2.SaveFile(objSaveItem2);
            }
        }
        public class clsForm1Setting
        {
            public DateTime TimeStamp;
        }
        public class clsForm2Setting
        {
            public DateTime TimeStamp;
        }
        public class clsGenericsTest<T> where T : class, new()
        {
            private string _filePath;
            private clsGenericsTest() { }
            public clsGenericsTest(string FilePath) { _filePath = FilePath; }
            public void SaveFile(T item)
            {
                XmlSerializer serializer1 = new XmlSerializer(typeof(T));
                StreamWriter sw = new StreamWriter(_filePath, false, Encoding.GetEncoding("Shift_JIS"));
                serializer1.Serialize(sw, item);
                sw.Close();
            }
            public T ReadFile()
            {
                XmlSerializer serializer = new XmlSerializer(typeof(T));
                StreamReader sr = new StreamReader(_filePath, Encoding.GetEncoding("Shift_JIS"));
                T obj = (T)serializer.Deserialize(sr);
                sr.Close();
    
                return obj;
            }
        }

違反を報告
引用返信
■35581 / ResNo.3)  Re[2]: 抽象クラスで実装したクラスの情報を知る
□投稿者/ 夏風 一般人(4回)-(2024/02/21(Wed) 08:11:52)
  • アイコン魔界の仮面弁士さん、とくまさん
    回答ありがとうございます。

    まだ、さらっとしか見ていませんが、お二人とも同じような考え方で復元のところでジェネリックを使うようにするんですね。

    自分は、魔界の仮面弁士さんの例でいうとSampleClass自体がSampleClassBaseを継承して、LoadFromFileを読んだ時点でSampleClassのTimeStampを戻せないかなと考えていました。
    ただ、これだと実行するまで抽象クラス側では実際の型がわからないのでデバッグ時大変そうになりそうですね。

    お二人に提示していただいたものを参考に作成してみます。
解決み!
違反を報告
引用返信

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



■記事リスト / ▲上のスレッド
■35573 / 親記事)  Processクラスからbatファイル実行後、KILLできない
□投稿者/ あばば無人君 一般人(1回)-(2024/01/13(Sat) 05:19:30)
  • アイコン環境/言語:[Windows10(64bit/Home/22H2)、NET Framework-4.8.1、C#] 
    分類:[.NET] 

    約3年ぶりの投稿となります。宜しくお願いします。

    掲題の件ですが、WinFormアプリを新規で用意し、
    画面に開始ボタン(button1)と停止ボタン(button2)を配置しました。

    開始ボタンを押下するとProcessクラスでbatファイルを実行し、
    その処理が終わる前に停止ボタンを押下するとProcessクラスの
    KILLを実行して強制終了させる、というシンプルなアプリです。

    その実装は以下となります。
    001 public partial class Form1 : Form
    002 {
    003 private Process myProcess;
    004
    005 public Form1()
    006 {
    007 InitializeComponent();
    008
    009 this.button1.Click += this.button1_Click;
    010
    011 this.button2.Click += this.button2_Click;
    012 this.button2.Enabled = false;
    013 }
    014
    015 private void button1_Click(object sender, EventArgs e)
    016 {
    017 // 開始ボタン:非活性 / 停止ボタン:活性
    018 SwitchButtonEnable(false);
    019
    020 // 10秒間スリープするだけのバッチを指定
    021 this.myProcess = new Process();
    022 this.myProcess.StartInfo.FileName = @".\Sample.bat";
    023
    024 // バッチ処理の終了時に発生させるイベント処理を指定
    025 // ※SynchronizingObjectプロパティに当画面のインスタンスを指定することで
    026 // このイベント処理はGUIスレッドで動作する
    027 this.myProcess.Exited += button2_Click;
    028 this.myProcess.EnableRaisingEvents = true;
    029 this.myProcess.SynchronizingObject = this;
    030
    031 // 開始
    032 this.myProcess.Start();
    033 }
    034
    035 private void button2_Click(object sender, EventArgs e)
    036 {
    037 // すでに当処理が実施済みなら何もしない
    038 if (this.myProcess == null) { return; }
    039
    040 // バッチ処理の終了時に発生させるイベント処理を削除
    041 this.myProcess.Exited -= button2_Click;
    042 this.myProcess.EnableRaisingEvents = false;
    043
    044 if (!this.myProcess.HasExited)
    045 {
    046 try
    047 {
    048 this.myProcess.Kill();
    049 }
    050 catch
    051 {
    052 // 停止ボタン押下直後にプロセスが終了したケースを想定
    053 // よって例外をキャッチしても何もしていない
    054 }
    055 }
    056
    057 // 怒涛のインスタンス開放
    058 this.myProcess.Refresh();
    059 this.myProcess.Close();
    060 this.myProcess.Dispose();
    061 using (this.myProcess) { }
    062
    063 // 閉じるボタン押下とプロセス終了イベントがほぼ同時に発生した時、
    064 // 当関数の処理が2回実行されない様にnullを設定しておく
    065 this.myProcess = null;
    066
    067 // 開始ボタン:活性 / 停止ボタン:非活性
    068 SwitchButtonEnable(true);
    069 }
    070
    071 private void SwitchButtonEnable(bool isEnable)
    072 {
    073 button1.Enabled = isEnable;
    074
    075 button2.Enabled = !isEnable;
    076 }
    077 }

    以上を踏まえて、このアプリ、停止ボタンを押下しても
    起動したbatが終了しません。
    コード22行目で指定している「Sample.bat」は
     timeout /T 10
    というスリープ処理が1行あるだけの物となっています。

    しかもコード22行目の起動対象ファイルを
    ・メモ帳 "C:\Windows\System32\notepad.exe"
    ・エクセルファイル ".\適当.xlsx"
    などにした場合は期待通り終了します。

    ここから質問ですが、
    @batだけ終了しないのは何故か?
    Abatを終了させる方法はあるか?
    が分かる方、いらっしゃいましたらお力添えいただきたいです。
    ※特にAが知りたいです

    長くなりましたが宜しくお願い致します。


違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35574 / ResNo.1)  Re[1]: Processクラスからbatファイル実行後、KILLできない
□投稿者/ Azulean 大御所(545回)-(2024/01/13(Sat) 14:01:27)
  • アイコンNo35573に返信(あばば無人君さんの記事)
    > コード22行目で指定している「Sample.bat」は
    >  timeout /T 10
    > というスリープ処理が1行あるだけの物となっています。

    たとえば、バッチファイルを「pause」として入力待ちだけにすれば、このコードでも問題なく動作すると思います。

    timeout の場合、cmd.exe とは別に timeout.exe プロセスが立ち上がります。
    今回のコードでは cmd.exe は終了できますが、子プロセスである timeout.exe は生き残っていますので、止まりません。


    ご自身で子プロセスの列挙と停止といった処理を作る必要があるそうです。
    https://stackoverflow.com/a/32405627
違反を報告
引用返信
■35575 / ResNo.2)  Re[2]: Processクラスからbatファイル実行後、KILLできない
□投稿者/ あばば無人君 一般人(2回)-(2024/01/13(Sat) 17:01:14)
  • アイコンNo35574に返信(Azuleanさんの記事)

    > ■No35573に返信(あばば無人君さんの記事)
    > たとえば、バッチファイルを「pause」として入力待ちだけにすれば、このコードでも問題なく動作すると思います。
    >
    > timeout の場合、cmd.exe とは別に timeout.exe プロセスが立ち上がります。
    > 今回のコードでは cmd.exe は終了できますが、子プロセスである timeout.exe は生き残っていますので、止まりません。

    ご記載のとおり、pauseコマンドですと期待通り終了しましたし、
    FTPコマンド(ftp.exe)だとtimeoutと同じく終了しませんでした。

    なるほど、別プロセスですか。盲点でした。


    > ご自身で子プロセスの列挙と停止といった処理を作る必要があるそうです。
    > https://stackoverflow.com/a/32405627

    参考リンク、ありがとうございます。時間ができたらサンプルを作ってみます。

    今回は客先指定のアプリが手元に無かったのでbatのtimeoutで代用していましたが、
    客先指定のアプリがKILLで終了するのは分かっているので
    本件はこれで解決とさせていただきます。

    ご回答ありがとうございました。

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

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






Mode/  Pass/


- Child Tree -