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

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

記事リスト ( )内の数字はレス数
NomalWindowsMediaPlayerで次のURLを指定しても反映されない。(2) | Nomal"−"を縦書きにしたい(9) | Nomal.NET6.0 のWinFormにWPFのユーザーコントロールを配置したい(4) | NomalDataGridViewの列にコンボボックスを表示する(2) | Nomalデータグリッドビューの特定の列ヘッダの色(2) | NomalVB-Report10→11への移行(4) | Nomalデフォルトプリンタの用紙向き変更(0) | NomalASP.net デバッグ時の .js ファイルの変更が反映されない(1) | NomalpictureBoxとlabelの重ね合わせ(2) | NomalWindowsエクスプローラへのドロップ先フォルダの取得(4) | Nomal入力値を元に描画させたい(2) | NomalVBで開いたExcelでのイベントを取得するには(4) | NomalデザイナでSystemColorsのような色一覧から選択できるようにしたい(0) | NomalTaskの入れ子の待ち方2(4) | NomalTaskの入れ子の待ち方(5) | NomalVisualStudio2019 以降の検索ダイアログが正常に動作しない(2) | NomalUsingの使い方が間違っている?(4) | Nomal//./の意味は?(2) | Nomalバイナリーファイルの結合と分解(2) | NomalVSTOとWebView2の共存って可能?(2) | Nomal表の最後の行の下にDropできない(1) | NomalCookieの勉強を始めました。(2) | NomalDataGridViewの特定セルにボタンを配置する方法(3) | NomalDataGridViewのセル結合部分にボタンを表示する方法(3) | Nomal複数のPageに分かれる場合のスクレ―ピング(6) | NomalTask.Runの使い方(4) | NomalPictureBox のサイズを設定する(2) | NomalProcessクラスMainModuleプロパティでアクセス拒否(3) | NomalLINQでControlsをEnable=Falseに設定(3) | Nomalランダムファイルを高速化させたい(5) | Nomalプロセス間の通信(相互)(2) | NomalC#をVBに変換する方法が分かりません(1) | NomalPictureBoxに動的に画像を表示する(1) | NomalYahooのHPで、検索文字の入力ができない(3) | NomalWebView2のEncodeの問題?(5) | NomalWinFormでChromeをSeleriumで操作しているが、Closeの仕方(2) | Nomal印刷部数の固定(1) | NomalWinformでのDataGridView Comboboxのデータ追加削除が出来ない(3) | Nomalプログラムについて。(2) | Nomal拡張子関連付けのサンプルで削除時 例外発生(1) | Nomalユーザーコントロールをフォームで使用した時のエラー(6) | NomalマルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する(12) | Nomal画像の大きさを取得するには(4) | Nomalファイルがドライブ内で占有する容量(3) | NomalC#FormのXボタンイベントで、e.Cancel が使えない(2) | NomalAxWindowsMediaPlayerでプレイリストの途中から再生するには(2) | NomalWebView2でJavaScriptの実行の終了イベント(4) | NomalDataTableのDataRowVersion毎のInt型値の比較がうまくいかない(5) | NomalGPTかMBRを判断したい(2) | Nomalアセンブリ言語について。(1) | Nomalマクロについて。(3) | NomalDLL内のスレッドからイベントを発行すると、受信したフォームでラベルが更新できない(3) | Nomalアセンブリ言語について。(20) | Nomalシステムコールについて。(2) | Nomal Parallel.Forで思ったより早くならない(5) | NomalAngleSharp.Scripting.JavaScriptの使い方(2) | NomalDataAdapterで2回目のUpDateが出来ない(6) | NomalForm1イベントの選択が出来なくなりました。(9) | Nomalデザーナー時の継承先formのサイズ(0) | Nomalコンソールではなくテキストボックスに文字列を出力したい(7) | NomalAngleSharpのクエリー文2(4) | Nomalコーディングについて。(3) | Nomaldll修正時、それを参照しているexeのリビルド要否(2) | NomalAngleSharpのクエリー文(2) | Nomalデフォルトプロパティを使いたい(6) | Nomalテキストボックスでの制御(7) | NomalUSBカメラをピクチャボックスに表示(3) | Nomal二次元配列内の文字の置き換え(3) | Nomalcolor型を引数にする方法(2) | NomalVSプロジェクト作成方法の違いによる、プラグイン機能を持つアプリケーションへの影響について(6) | NomalInputボタンが押せない(4) | NomalWebBrowserのDocumentCompletedイベントの切り替え(3) | NomalEndConnectでのエラー(2) | Nomalボタンクリック時のLeaveイベントについて(1) | Nomalエクセルのデータを配列に読込んだ時の配列要素番号について(2) | Nomalorder by で抽出したデータをDataTableに入れてForEachでDataRow取得した際の順番(2) | Nomal非同期プログラミング時のConsole.WriteLineの動作(4) | NomalC#からストアドにDecimalを渡すと値が丸められる(4) | Nomalインスタンスの型を文字列で指定したい(2) | NomalSendKeys.Sendが効いていない(2) | Nomal他のプロジェクトのコントロールがツールボックスに表示されない(3) | Nomal複数のテキストボックス間のTextChangedイベントが相互干渉しないようにしたい(9) | Nomal呼び出し元によってWebApi側の処理速度に差が出る(1) | NomalPanelのDock=Topだとうまくいかない。代替案。(2) | Nomal.NetでのIPv6の比較(5) | Nomal.Net 5.0 におけるDLL参照問題?(7) | Nomal追加コントロールのtabindex値を既存の間に設定する方法(1) | NomalVB.net非同期処理でtextboxに出力したい(2) | NomalToolStripStatusLabelの空白部分を埋めたい(2) | NomalOracle への OleDb 接続に失敗する(3) | Nomal正規表現で株価を取得したい(1) | NomalVB.NETで作成したDLLをVB6.0から呼び出す(3) | Nomalデザイナで編集・チェックアウトキャンセルすると(3) | Nomal親スレッドへ処理の移譲(7) | NomalクラスによるGetBytes関数のエンディアンの違い(2) | Nomal[VB.NET]Excelのプロセスが終了しない(2) | NomalC#をVBに変換した際の強制的な参照渡し(2) | Nomal.Net 5.0 におけるServiceControllerの代替クラス(3) | Nomal新たにshowしたフォームでのボタンのクリック(5) | NomalVB.NETからRDゲートウェイを利用したリモートデスクトップ接続(4) |



■記事リスト / ▼下のスレッド
■34679 / 親記事)  他のプロジェクトのコントロールがツールボックスに表示されない
□投稿者/ VBリハビリ中 一般人(6回)-(2021/03/28(Sun) 20:35:02)
  • アイコン環境/言語:[Microsoft Visual Studio Community 2019 VB.NET] 
    分類:[.NET] 

    他のプロジェクトで作成されているコントロール(カスタムテキストボックス)をソリューションのメインのプロジェクトで参照し、
    ツールボックスのアイテムの選択で、そのDLLファイルを選択し、
    チェックが入っていることを確認してOKを押しても、ツールボックスには表示されず、
    ツールボックスからツールボックスのアイテムの選択を見ると、やはり追加されていません。

    エラーメッセージも特に出ないのですが、何が原因と考えられるでしょうか?

    気になる点としては、他のコンポーネントのバージョンが4.0〜や10.0〜である中、
    このコンポーネントだけ1.3〜であるところですが、プロジェクトそのものは同じ環境で(対象のフレームワークは4.7.2で)ビルドしています。ビルドのバージョン指定が別にあるのかもしれないのですが、見つけきれませんでした。


違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■34680 / ResNo.1)  Re[1]: 他のプロジェクトのコントロールがツールボックスに表示されない
□投稿者/ 魔界の仮面弁士 大御所(1325回)-(2021/03/29(Mon) 01:53:08)
  • アイコンNo34679に返信(VBリハビリ中さんの記事)
    > ツールボックスからツールボックスのアイテムの選択を見ると、やはり追加されていません。

    [ツール]-[オプション]-[Windows フォーム デザイナー]-[全般]の
    「ツールボックスの自動取得」が True になっていますか?

    そこが True になっていて、それでも表示されない場合は、
    ツールボックスを右クリックして、「アイテムの選択」を選んでみてください。
違反を報告
引用返信
■34681 / ResNo.2)  Re[2]: 他のプロジェクトのコントロールがツールボックスに表示されない
□投稿者/ VBリハビリ中 一般人(7回)-(2021/03/29(Mon) 18:05:24)
  • アイコン> [ツール]-[オプション]-[Windows フォーム デザイナー]-[全般]の
    > 「ツールボックスの自動取得」が True になっていますか?
    なっています。

    >
    > そこが True になっていて、それでも表示されない場合は、
    > ツールボックスを右クリックして、「アイテムの選択」を選んでみてください。
    ツールボックスを右クリックして、アイテムの選択で選んでいます。
    しかし、ツールボックスには(再描画されている気配はありますが)追加されません。
    .NET Frameworkコンポーネントのタブの中には表示されるのですが。。
    .NET Frameworkコンポーネントのタブのリセットボタンをやってみてもダメでした。

違反を報告
引用返信
■34682 / ResNo.3)  Re[3]: 他のプロジェクトのコントロールがツールボックスに表示されない
□投稿者/ VBリハビリ中 一般人(8回)-(2021/03/30(Tue) 23:00:49)
  • アイコン2021/03/30(Tue) 23:02:31 編集(投稿者)
    2021/03/30(Tue) 23:01:41 編集(投稿者)

    どうやら、.NET 5.0では、
    public partial class UserControlxxx : UserControl
    はデザイナで開けますが、
    public partial class UserControlxxx : ContainerControl
    にすると、開けなくなります。

    というよりも、直接の原因は、
    ContainerControlを継承すると、
    デザイナが
    this.Load += new System.EventHandler(this.UserControlxxx_Load);
    というコードを追加してくるのですが、

    private void UserControlxxx_Load(object sender, EventArgs e)
    { }
    のように空実装を入れても、

    Value cannot be null. (Parameter 'rootComponent')
    のエラーが出て、ダメなようです。。

    ターゲットランタイムを落とせば大丈夫なことまではわかりましたが。。


違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34667 / 親記事)  複数のテキストボックス間のTextChangedイベントが相互干渉しないようにしたい
□投稿者/ VBリハビリ中 一般人(1回)-(2021/03/22(Mon) 20:22:30)
  • アイコン環境/言語:[Microsoft Visual Studio Community 2019 VB.NET] 
    分類:[.NET] 

    例えば、AとBのテキストボックスがあり、それぞれのテキストボックスのTextChangedイベントで、他のテキストボックスに編集結果を表示するものとします。

    ここで、Aの値が変更されるとBの値が変更され、結果、BのTextChangedイベントでAの値も更新されてしまいます。

    AによるTextChanged発火の場合には、BのTextChangedイベントは実行しないようにするためのイベントの制御方法はあるでしょうか?(フラグによる方法以外で)
    実際にはテキストボックスが数多くあり、フラグによる制御以外があれば教えてください。
違反を報告
引用返信

▽[全レス9件(ResNo.5-9 表示)]
■34672 / ResNo.5)  Re[4]: 複数のテキストボックス間のTextChangedイベントが相互干渉しないようにしたい
□投稿者/ 魔界の仮面弁士 大御所(1320回)-(2021/03/23(Tue) 18:10:57)
  • アイコン
    No34670に返信(VBリハビリ中さんの記事)
    > もし、上記でうまくいったら、
    > AddHandler objTextBox.TextChanged, AddressOf 〜 上記の3行追加
    
    イベントはマルチキャストデリゲートなので、その方法では意味が無いですよ。
    (それぞれのイベントハンドラは、独立したデリゲートインスタンスです)
    
    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            AddHandler Button2.Click, AddressOf Example
        End Sub
    
        Private Sub Example(sender As Object, e As EventArgs)
            Static cnt As Integer
            cnt += 1
            Button2.Text = cnt.ToString()
        End Sub
    End Class
    
    
    
    
    Public Class Form1
    
        'AddressOf で呼ばれるメソッド
        Private Sub Example()
            Static cnt As Integer
            cnt += 1
            Button2.Text = cnt.ToString()
        End Sub
    
        ' デリゲート型変数
        Private ExampleProc As MethodInvoker = Nothing
    
        ' AddressOf Example を追加登録する
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            ExampleProc = DirectCast(MulticastDelegate.Combine(ExampleProc, New MethodInvoker(AddressOf Example)), MethodInvoker)
        End Sub
    
        ' Button2 を押すと Example が呼ばれて、Button2.Text がカウントアップされる
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            ExampleProc?.Invoke()
        End Sub
    
    
        ' 登録されたデリゲートを順に取り出して、個別に呼ぶこともできる
        Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
            If ExampleProc Is Nothing Then
                Return
            End If
            For Each p As MethodInvoker In ExampleProc.GetInvocationList()
                p()
            Next
    
        End Sub
    End Class

違反を報告
引用返信
■34673 / ResNo.6)  Re[4]: 複数のテキストボックス間のTextChangedイベントが相互干渉しないようにしたい
□投稿者/ 魔界の仮面弁士 大御所(1321回)-(2021/03/23(Tue) 18:15:38)
  • アイコン2021/03/23(Tue) 18:17:12 編集(投稿者)

    No34671に返信(VBリハビリ中さんの記事)
    > 拡張メソッド?は、既存のテキストボックスに対して追記できるのでしょうか?

    InitializeComponent に手を加える必要はありません。

    プロジェクトに、新しいモジュールファイル (*.vb) を追加して、
    その中身を No34669 のコードに差し替えてください。準備はそれだけです。


    そうすると、すべての TextBox (RichTextBox や MaskedTextBox も含む)に
    SetText メソッドが追加されます。
違反を報告
引用返信
■34674 / ResNo.7)  Re[5]: 複数のテキストボックス間のTextChangedイベントが相互干渉しないようにしたい
□投稿者/ VBリハビリ中 一般人(4回)-(2021/03/23(Tue) 21:42:37)
  • アイコン>>もし、上記でうまくいったら、
    >>AddHandler objTextBox.TextChanged, AddressOf 〜 上記の3行追加
    >
    > イベントはマルチキャストデリゲートなので、その方法では意味が無いですよ。
    > (それぞれのイベントハンドラは、独立したデリゲートインスタンスです)
    >
    について、ご提示いただいたソースは高度まだ理解して試せていませんが、
    以下のソースでは、各イベントにおけるDirectCast(sender, TextBox).Modifiedの値による判定ができないようです。

    Formのロードイベントでイベントハンドラをテキストボックスに対して一括で登録

    (Form上のテキストボックスの列挙のループ内)
    AddHandler objTextBox.TextChanged, AddressOf CtrlTextChangedEvent


    上記で登録するメソッド
    Private Sub CtrlTextChangedEvent(ByVal sender As Object, ByVal e As System.EventArgs)
    If TypeOf sender Is TextBox Then
    If Not DirectCast(sender, TextBox).Modified Then e.Handled = True '←TextChangedイベントにはHandledプロパティがない

    End If
    End Sub

    全テキストボックスのTextChangedイベントの冒頭に
    If Not DirectCast(sender, TextBox).Modified Then Return '(※)
    を入れればうまく動きそうなことは確認できたのですが、
    TextChangedイベントにはHandledプロパティがないため、
    ※のコードを1箇所に集約することはできないのでしょうか?


違反を報告
引用返信
■34676 / ResNo.8)  Re[6]: 複数のテキストボックス間のTextChangedイベントが相互干渉しないようにしたい
□投稿者/ 魔界の仮面弁士 大御所(1323回)-(2021/03/24(Wed) 09:57:49)
  • アイコン
    No34674に返信(VBリハビリ中さんの記事)
    > '←TextChangedイベントにはHandledプロパティがない
    イベントのプロパティというと違和感がありますので、
    イベント引数のプロパティといった方が良いかも。
    
    DataGridView の CellPainting のイベントのように、第二引数 e が
    「System.ComponentModel.HandledEventArgs を継承したクラス」であった場合は
    Handled プロパティが使えます。
    
    Form の FormClosing イベントのように、第二引数 e が
    「System.ComponentModel.CancelEventArgs を継承したクラス」であった場合は
    Handled プロパティが使えます。
    
    このほか、PrintDocument の PrintPage イベントのように、
    PrintPageEventArgs クラスの HasMorePages プロパティなどもそうですね。
    あるいは一部の COM イベントのように、「戻り値を持つ特殊なイベント」で
    同様の仕組みを持たせているケースもあります。
    
    
    しかし、TextChanged イベントが要求するのはただの EventArgs であり、
    こうしたフィードバック用の仕組みは一切用意されていません。
    どうしても必要なら、そういうイベントを自作しましょう。
    
    <System.ComponentModel.DefaultEvent("TextChanging")>
    Public NotInheritable Class 自作TextBox型
        Inherits TextBox
        Public Event TextChanging As EventHandler(Of System.ComponentModel.HandledEventArgs)
        Protected Overrides Sub OnTextChanged(e As EventArgs)
            Dim arg As New System.ComponentModel.HandledEventArgs(False)
            RaiseEvent TextChanging(Me, arg)
            If Not arg.Handled Then
                MyBase.OnTextChanged(e)
            End If
        End Sub
    End Class
    
    
    
    > If TypeOf sender Is TextBox Then
    >     If Not DirectCast(sender, TextBox).Modified Then
    
    これだと、TypeOf と DirectCast の処理が必要ですが、
    TryCast を使えば、型判定と型変換を一回の処理で済ませられます。
     Dim txt = TryCast(sender, TextBox)
     If txt?.Modified Then
    
    また、このイベントハンドラーとして用いるメソッドが
    TextBox 専用なのであれば、引数定義を sender As Object ではなく
    sender As TextBox にしておくということもできます。
    
    といっても、TextChanged イベントでは e.Handled = True に相当するような
    仕組みが無いので、どちらにせよ無意味なわけですが…。
    
    
    >>(それぞれのイベントハンドラは、独立したデリゲートインスタンスです)
    > について、ご提示いただいたソースは高度まだ理解して試せていませんが、
    > 以下のソースでは、各イベントにおけるDirectCast(sender, TextBox).Modifiedの値による判定ができないようです。
    
    仕組み上、そのような方法は原理的に不可能である、という話です。
    AddHandler したところで、新しいデリゲートインスタンスが割り当てられるだけであり、
    既存のデリゲートインスタンスには何の意味もありません。
    
    これは、WithEvents + Handles で割り当てたものであっても同様であり、
    それぞれの処理は独立しており、割り当てた順にただ呼び出されていくだけです。
    
    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            MsgBox("Button1 の Click イベントで呼ばれる処理")
        End Sub
    
        Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
            MsgBox("TextBox1 の TextChanged で呼ばれる処理")
        End Sub
    
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click, Button1.Click, TextBox1.TextChanged
            MsgBox("Button2 の Click イベントの他、Button1 や TextBox1 からも呼ばれる処理")
        End Sub
    End Class
    
    
    Handled / Cancel / HasMorePages のようなメンバーがある場合は、True をセットすることで
    それ以降に発生する後続のイベント発生を抑制できるように設計されている可能性がありますが、
    少なくとも標準の TextChanged にはそういう仕組みがありません。
    
    
    ですから後から処理を加えるのではなく、元の処理をすべて書き直す方向で検討してください。
    
    
    一応、先に登録済みのイベントハンドラーを把握しているのであれば、
    
    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        RemoveHandler TextBox1.TextChanged, AddressOf TextBox1_TextChanged
        TextBox1.Text = "新しいテキストの書き換え"
        AddHandler TextBox1.TextChanged, AddressOf TextBox1_TextChanged
    End Sub
    
    のようにして、一時的にイベント割り当てを解除して、再度割り当てなおすといった手法は取れます。
    とはいえ、これだと「フラグ処理」と結局は変わりませんね。
    というか「TextBox1.Modified による判定」も、フラグ処理の一種にあたるわけですが…。
    
    ちなみに、上記をリフレクションで行っているのがこちら。
    https://itthestudy.com/csharp-event-stop/
    
    
    もし、既存のイベントハンドラーの記述を一切変更することなく対処したいなら、
    TextBox を継承したクラスで TextBox の OnTextChanged メソッドをオーバーライドして、
    「一時的に MyBase.OnTextChanged(EventArgs.Empty) を呼び出さないモード」を搭載する必要があるでしょうね。
    
    たとえば下記のコントールでは、UseTextChanged プロパティを False に変更している間は、
    Text プロパティを書き換えても TextChanged イベントが発生しなくなります。
    
    Public Class 自作TextBox型
        Inherits TextBox
        Public Property UseTextChanged As Boolean = True
        Protected Overrides Sub OnTextChanged(e As EventArgs)
            If UseTextChanged Then MyBase.OnTextChanged(e)
        End Sub
    End Class

違反を報告
引用返信
■34678 / ResNo.9)  Re[7]: 複数のテキストボックス間のTextChangedイベントが相互干渉しないようにしたい
□投稿者/ VBリハビリ中 一般人(5回)-(2021/03/26(Fri) 19:54:48)
  • アイコン魔界の仮面弁士さん

    ありがとうございます。

    > 少なくとも標準の TextChanged にはそういう仕組みがありません。
    >
    > ですから後から処理を加えるのではなく、元の処理をすべて書き直す方向で検討してください。

    これがすべてを表してました。
    TextChangedにはない、イベントをキャンセルさせる仕組みを使うには、標準のテキストボックスを継承して作るしかない、ってことですね。

    デリゲートインスタンスというtermは理解していないのですが、いわゆるイベントハンドラの名前でRemoveHandlerしないかぎり、同じイベントハンドラ名でAddHandlerしても、上書きではなく、追加される(別のイベントハンドラのインスタンスとして残る)ということでしょうか。

    ただ、自作TextBox型を作っても、ツールボックスからの張替え、もしくはデザイナのソースにおけるchange all(これはやりたくありません)
    をしなければならないですよね。。

    多数の画面に同様のテキストボックスがあり、ここは安全策で、
    全テキストボックスの冒頭に
    If Not DirectCast(sender, TextBox).Modified Then Return
    を地味に追加するのが得策かと思えてきました。

    既存の処理で、AddHandler KeyPressイベントではe.Handledを使って数字入力のみの実装ができているのに、
    なぜTextChangedにはないのか判然としないのですが。。

    いずれにしてもよい勉強になりました。
    ありがとうございました。










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

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34666 / 親記事)  呼び出し元によってWebApi側の処理速度に差が出る
□投稿者/ ぺんたごん 一般人(1回)-(2021/03/12(Fri) 17:40:57)
  • アイコン環境/言語:[C#、.NET 4.7、Windows 10 64bit] 
    分類:[ASP.NET] 

    お久しぶりです。
    やや不可解な現象に遭遇したのでお知恵を拝借したく…

    今回、ASP.NET Web APIで、POSTでJSONの送受信を行う
    RESTサービスを1つ作りました。

    内部では、パラメータで渡された件数分だけループしながら
    SQL Serverへのアクセスを行っています。

    ここで、Chromeアドオンの「Talend API Tester」を使って
    テストするとおよそ2秒で処理が完了します。
    しかし、JavaScript(jQueryのajax)でサービス呼び出しを
    組んでブラウザ(IE11, Chrome)で動作させると、なんと約15秒もかかります

    1個1個の処理はほとんど数ミリ秒レベルで終わるものですが
    ループ数が多い(言うても500くらい)というパターンです。

    リクエストサイズは180KB、レスポンスは10KB程度なので
    通信部分でもたついてるわけでもないです
    (サービスをVSでデバッグしてStopwatchで計測してる)

    色々見てると、JSから呼び出された場合は
    DBアクセス発生するメソッドの戻りが
    数十ミリ秒ほど遅くなっているように見えました。
    (メソッドは別dllなのでまだ調査しきれてませんが)

    これを500ループすれば確かに秒単位で遅くなりますが、
    そもそも呼び出し元によってサーバサイドの
    処理速度が変化することがあり得るんでしょうか…

    実際起きているので謎ですが、そういった現象について
    何かご存知の方いらっしゃいますでしょうか…

    何卒よろしくお願いします
違反を報告
引用返信

▽[全レス1件(ResNo.1-1 表示)]
■34677 / ResNo.1)  Re[1]: 呼び出し元によってWebApi側の処理速度に差が出る
□投稿者/ 魔界の仮面弁士 大御所(1324回)-(2021/03/24(Wed) 14:04:44)
  • アイコンNo34666に返信(ぺんたごんさんの記事)
    > 今回、ASP.NET Web APIで、POSTでJSONの送受信を行う
    > RESTサービスを1つ作りました。

    自己管理されているサービスのようなので、

    失敗した要求のトレース
    http://mtgiis.blogspot.com/2013/02/blog-post_17.html

    を使って、状態コード 200-599 の範囲を一時的に追跡し、
    Talend API Tester の場合とブラウザーの場合とで、
    リクエスト内容がどのように違うのかを比較してみては如何でしょう。
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34662 / 親記事)  PanelのDock=Topだとうまくいかない。代替案。
□投稿者/ ぽとて 一般人(1回)-(2021/03/02(Tue) 19:44:27)
  • アイコン環境/言語:[Visual Studio 2017 (VB)] 
    分類:[.NET] 

    2021/03/02(Tue) 19:52:31 編集(投稿者)
    2021/03/02(Tue) 19:52:25 編集(投稿者)
    2021/03/02(Tue) 19:51:57 編集(投稿者)
    
    フォームにPanelを2つ(Panel1とPanel2)、配置します。
    Panel1はフォームの上にぴったりくっつけます。
    Panel2はPanel1の下にぴったりくっつけます。
    Panel1とPanel2は高さが固定ではありません。
    (実際には、同じように
     Panel2の下にPanel3、
     Panel3の下にPanel4と
     全部で4つPanelがありますが、
     ここでは省略します。)
    
    上を実現するために
    Panel1.DockとPanel2.DockをTopにすると
    実現できます。
    
    フォームのサイズは手動で変更可能です。
    フォームのサイズを小さくした場合には
    フォームにスクロールバーを表示させて
    スクロールすればPanel1,Panel2を表示できるようにしたいので
    フォームのAutoScrollをTrueに設定しています。
    
    このようにした時に、
    フォーム右側に縦スクロールは表示されるのですが、
    下に横スクロールが表示されません。
    
    下に横スクロールも表示させる、良い方法はありませんでしょうか?
    Dock=Topを使わなくても、実現できるのであれば、それでもかまいません。
    
    上手く説明できていないかもしれませんが、
    よろしくお願いします。
    
    
    
    
    ┏━━━━━━━━━━━┓
    ┃タイトルバー     ┃
    ┣━━━━━━━━━┳━┫
    ┃Panel1      ┃▲┃
    ┃         ┃ ┃
    ┃         ┃ ┃
    ┠─────────┨ ┃
    ┃Panel2      ┃ ┃
    ┃         ┃ ┃
    ┃         ┃▼┃
    ┗━━━━━━━━━┻━┛
    
      下のようにしたい。
    ┏━━━━━━━━━━━┓
    ┃タイトルバー     ┃
    ┣━━━━━━━━━┳━┫
    ┃Panel1      ┃▲┃
    ┃         ┃ ┃
    ┃         ┃ ┃
    ┠─────────┨ ┃
    ┃Panel2      ┃ ┃
    ┃         ┃ ┃
    ┃         ┃▼┃
    ┣━━━━━━━━━╋━┫
    ┃←       →┃ ┃
    ┗━━━━━━━━━┻━┛
    

違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34664 / ResNo.1)  Re[1]: PanelのDock=Topだとうまくいかない。代替案。
□投稿者/ 魔界の仮面弁士 大御所(1317回)-(2021/03/03(Wed) 09:24:51)
  • アイコンNo34662に返信(ぽとてさんの記事)
    > フォームにスクロールバーを表示させて
    > スクロールすればPanel1,Panel2を表示できるようにしたいので
    > フォームのAutoScrollをTrueに設定しています。

    水平にせよ垂直にせよ、スクロールバーというものは、
    「表示しきれないほどの広大な領域」があって、それを
    「それよりも狭小な領域」に収めるための手段ですよね。

    では今回の場合、本来あるべきスクロール量は如何ほどなのか、
    事前にわかるようになっているのでしょうか。


    たとえば、必要な領域が 3000x2000 だとして、これを収めたいとします。
    4K モニターで 100% 解像度(3840x2160) なら入りきりますが、
    2K モニター(1920x1080)だと、スクロールが必要になる状況です。

    その場合、たとえばこのように配置することができます。

    (1) Form1 上に、下記の Panel0 を配置する。
     AutoScroll = False
     Location = (0,0)
     Dock = None
     Size = (3000,2000)…必要な領域サイズ

    (2) Panel0 上に、Panel1 を Dock = Top で配置

    (3) Panel0 上に、Splitter1 を Dock = Top で配置。(無くても良い)

    (4) Panel0 上に、Panel2 を Dock = Top で配置。

    (5) Panel0 上に、Splitter2 を Dock = Top で配置。(無くても良い)

    (6) Panel0 上に、Panel3 を Docl = Fill で配置。

    (7) Form1 の AutoScrollMode を True に設定すれば完成です。
     必要に応じて、MaximumSize と MinimumSize も設定しておきましょう。



    > Panel1とPanel2は高さが固定ではありません。
    どのように変動させるのか分からなかったので、上記では Splitter を使わせてもらいました。

    他にも、Panel0 を SplitContainer (Orientation = Horizontal) や
    TableLayoutPanel に差し替える手もあります。

    ※ただし TableLayoutPanel はレンダリングが遅いため、あまりお奨めしません。

違反を報告
引用返信
■34665 / ResNo.2)  Re[2]: PanelのDock=Topだとうまくいかない。代替案。
□投稿者/ ぽとて 一般人(2回)-(2021/03/03(Wed) 23:22:37)
  • アイコンなんとなくできそうな気がしてきました。
    フォームに直接Panelを配置せず、間に1個Panelをかませばよいのですね。
    試してみようと思います。ありがとうございました。

    例えばですが、
    Panel1上にDataGridView(Anchor=Top,Left,Right,Bottom)が配置されていて、
    DataGridViewには縦スクロールバーを表示させずに
    全データを(スクロールせずに)表示させたいという物があります。
    その場合、DataGridViewにDataTableをセットした上で
    行数や高さ、ColumnHeaderの高さなどから
    DataGridView自体の高さを算出し、そこからPanelの高さを算出して、
    PanelのHeightに設定、というような感じの事をしています。
    スクロールバーはPanelやDataGridViewには表示させず、
    一番外側のフォームにのみスクロールバーが表示されるようにする。

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

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



■記事リスト / ▲上のスレッド
■34656 / 親記事)  .NetでのIPv6の比較
□投稿者/ あばば無人君 一般人(30回)-(2021/02/26(Fri) 14:39:28)
  • アイコン環境/言語:[Windows10(2004) 64bit、.Net 5.0、VS2019(16.8.5)Com版、C#] 
    分類:[.NET] 

    いつも本掲示板でお勉強させていただいております。

    さてタイトルの件ですが、ご存知の通りIPv6は同じアドレスでも
    以下の様に複数の表記が可能です。
    2001:db8:0:0:1:0:0:1
    2001:0db8:0:0:1:0:0:1
    2001:db8::1:0:0:1
    2001:db8::0:1:0:0:1
    2001:0db8::1:0:0:1
    2001:db8:0:0:1::1
    2001:db8:0000:0:1::1
    2001:DB8:0:0:1::1

    そこで質問なのですが.Netのライブラリで表記(文字列)の異なる
    IPv6アドレスが等しいかチェックできる様なクラスなどあったり
    しませんでしょうか?

    普通にありそうな機能かと思ってネットを検索したのですが、
    私の見た限りでは発見できませんでした。

    理想としては
    XXXClass addPattern1 = new XXXClass("2001:db8:0:0:1:0:0:1");
    XXXClass addPattern2 = new XXXClass("2001:DB8:0:0:1::1");
    if (addPattern1.Equals(addPattern2)) { Debug.WriteLine("等しい"); }
    的な感じです。

    自分でも作れはしますが、もし.Netにあったら勿体ないので
    どなたかご存知の方がいらっしゃいましたら教えて下さい。

    以上です。宜しくお願い致します。

違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■34657 / ResNo.1)  Re[1]: .NetでのIPv6の比較
□投稿者/ Hongliang 大御所(597回)-(2021/02/26(Fri) 14:51:53)
  • アイコンSystem.Net名前空間のIPAddressクラスを使えばいいのではないでしょうか。
    文字列からはIPAddress.Parse静的メソッド(またはTryParse静的メソッド)でインスタンス化できます。
違反を報告
引用返信
■34658 / ResNo.2)  Re[2]: .NetでのIPv6の比較
□投稿者/ あばば無人君 一般人(32回)-(2021/02/26(Fri) 15:30:29)
  • アイコンHongliangさん、ご返信ありがとうございます。

    IPAddressクラスでのIPv6アドレス比較、できちゃいました…。

    以前このクラスで以下の様にIPv4アドレスで
    文字列比較とインスタンス比較した時に

    IPAddress add1 = IPAddress.Parse("172.17.22.100");
    IPAddress add2 = IPAddress.Parse("172.017.022.100");
    if (add1.Equals(add2)) { Debug.WriteLine($"等しい"); }
    if (add1.ToString().Equals(add2.ToString())) { Debug.WriteLine($"等しい"); }

    「等しくない」判定されたのでIPv6でも同じかと思っていました。
    まさかIPv6だと「等しい」判定になるとは…。

    何故IPv4だと等しくないのかは分かりませんが、
    ひとまずタイトルの件は解決したので解決済みと
    させていただきます。

    迅速な回答、ありがとうございました。

解決み!
違反を報告
引用返信
■34659 / ResNo.3)  Re[3]: .NetでのIPv6の比較
□投稿者/ Hongliang 大御所(598回)-(2021/02/26(Fri) 15:40:50)
  • アイコン2021/02/26(Fri) 15:52:43 編集(投稿者)

    IPv4において、0プリフィクスがついている桁は8進数を意味します。
    Trace.WriteLine(IPAddress.Parse("172.017.022.100"));
    => 172.15.18.100

    // ただし0プリフィクスがあっても普通に10進数で扱う流儀もあるのでいかんともしがたいですが。

    ちなみに0xプリフィクスで16進数表記もできます。

解決み!
違反を報告
引用返信
■34660 / ResNo.4)  Re[4]: .NetでのIPv6の比較
□投稿者/ あばば無人君 一般人(33回)-(2021/02/26(Fri) 17:18:20)
  • アイコンHongliangさん、再度返信ありがとうございます。

    > IPv4において、0プリフィクスがついている桁は8進数を意味します。
    > Trace.WriteLine(IPAddress.Parse("172.017.022.100"));
    > => 172.15.18.100

    おぉ!
    int i = 0x01;
    の様な数値リテラルだけでなく、上記の様な文字列
    (しかも.で区切られた途中のオクテットに対して)でも
    プレフィックスが有効になるのですね。
    等しくない扱いになるのは当然だったと(^_^;)

    細かい部分のフォローまでありがとうございました。

解決み!
違反を報告
引用返信
■34661 / ResNo.5)  Re[5]: .NetでのIPv6の比較
□投稿者/ あばば無人君 一般人(34回)-(2021/02/26(Fri) 18:17:53)
  • アイコン本件、微妙なオチまでつきました。

    Hongliangさんに教えて頂いたIPAddressクラスによる比較と、
    その他ネットを見ていたらNetworkInterfaceクラスから
    アダプタに設定されているIPアドレスをIPAddressクラスで
    取得できることを知り、以下の様なパソコンのNICに引数の
    IPアドレスが存在するかチェックする関数を作成しました。


    public bool ExistIpAddress(string ipAddress)
    {
      // 戻り値(初期値:存在しない)
      bool result = false;

      try
      {
        // 引数IPアドレス文字列からIPAddressクラスを生成
        IPAddress ipObj = IPAddress.Parse(ipAddress);

        // IPアドレスリストを生成
        List<IPAddress> addList = new List<IPAddress>();

        StringBuilder logStr = new StringBuilder();
        logStr.AppendLine($"有効なネットワークインターフェースカードとそのIPアドレス");

        // 全てのネットワークインターフェース(アダプタ)の数だけ繰り返す
        foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces())
        {
          // 有効(=稼働中)なアダプタでなければ次へ
          if (adapter.OperationalStatus != OperationalStatus.Up) { continue; }

          logStr.AppendLine($"{adapter.Name}({adapter.OperationalStatus})");

          // アダプタに設定された全IPアドレス情報を取得
          // ※1つのアダプタに複数のIPアドレスを設定できる点に注意!
          IPInterfaceProperties ifProperties = adapter.GetIPProperties();

          // 全IPアドレス情報をリストに追加
          foreach (UnicastIPAddressInformation info in ifProperties.UnicastAddresses)
          {
            // IPアドレス情報がIPv4かIPv6の場合
            if (info.Address.AddressFamily == AddressFamily.InterNetwork
            || info.Address.AddressFamily == AddressFamily.InterNetworkV6)
            {
              // そのままIPアドレスリストに追加
              addList.Add(info.Address);
              logStr.AppendLine($"  {info.Address}");
            }
          }
        }

        // 引数IPアドレスが存在するかチェック
        result = addList.Any(a => a.Equals(ipObj));

        // 存在しなかった場合だけログを出す
        if (!result)
        {
          logStr.AppendLine($"IPアドレス[{ipAddress}]は存在しません");
          Debug.WriteLine(logStr.ToString());
        }
      }
      catch (Exception ex)
      {
        Debug.WriteLine(ex.ToString());
      }

      return result;
    }


    試しにこの関数の引数にローカルPCのIPv6アドレス文字列を
    渡して動作確認してみたところ、「存在しない」となりました。

    原因を調べたところ、NetworkInterfaceクラスから取得できる
    IPAddressクラスにはIPアドレスの末尾に「スコープID」という
    NICを識別するコードが付いており、その情報まで込みで
    比較を行うために「存在しない」判定となっておりました。

    よってIPv6アドレスの場合は以下の様に再度IPAddressクラスを
    生成し直して比較することになりました。※修正箇所のみ記載


            // IPアドレス情報がIPv4の場合
            if (info.Address.AddressFamily == AddressFamily.InterNetwork)
            {
              // そのままIPアドレスリストに追加
              addList.Add(info.Address);
              logStr.AppendLine($"  {info.Address}");
            }
            // IPアドレス情報がIPv6の場合
            else if (info.Address.AddressFamily == AddressFamily.InterNetworkV6)
            {
              // NetworkInterfaceクラスから取得できるIPv6アドレスの場合は末尾にスコープIDが付加されており
              // スコープIDが付加された状態のIPAddressクラスだと↓のEquals関数による存在チェックで
              // 等しいと判定されないので、スコープIDを除去したIPアドレスで再度IPAddressクラスを生成した!
              // ※スコープIDは「%」より後ろに記述されている
              string[] addScope = info.Address.ToString().Split("%".ToCharArray());
              addList.Add(IPAddress.Parse(addScope[0]));
              logStr.AppendLine($"  {addScope[0]}");
            }

    結局泥臭いコードが入ってしまいました。
    ちゃんちゃん。

    では、長くなりましたがこの辺で。

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

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






Mode/  Pass/


- Child Tree -