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

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

記事リスト ( )内の数字はレス数
Nomal表の最後の行の下にDropできない(1) | NomalCookieの勉強を始めました。(2) | Nomal複数のPageに分かれる場合のスクレ―ピング(6) | NomalDataGridViewの特定セルにボタンを配置する方法(2) | NomalDataGridViewのセル結合部分にボタンを表示する方法(3) | NomalTask.Runの使い方(4) | Nomalランダムファイルを高速化させたい(5) | NomalPictureBox のサイズを設定する(2) | NomalProcessクラスMainModuleプロパティでアクセス拒否(3) | NomalLINQでControlsをEnable=Falseに設定(3) | Nomalプロセス間の通信(相互)(2) | NomalC#をVBに変換する方法が分かりません(1) | NomalPictureBoxに動的に画像を表示する(1) | NomalYahooのHPで、検索文字の入力ができない(3) | NomalWebView2のEncodeの問題?(5) | NomalWinFormでChromeをSeleriumで操作しているが、Closeの仕方(2) | NomalWinformでのDataGridView Comboboxのデータ追加削除が出来ない(3) | Nomal印刷部数の固定(1) | 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) | Nomalアセンブリ言語について。(20) | Nomalコーディングについて。(3) | NomalDLL内のスレッドからイベントを発行すると、受信したフォームでラベルが更新できない(3) | Nomal Parallel.Forで思ったより早くならない(5) | NomalForm1イベントの選択が出来なくなりました。(9) | Nomalシステムコールについて。(2) | NomalDataAdapterで2回目のUpDateが出来ない(6) | NomalAngleSharp.Scripting.JavaScriptの使い方(2) | Nomalデザーナー時の継承先formのサイズ(0) | Nomalコンソールではなくテキストボックスに文字列を出力したい(7) | NomalAngleSharpのクエリー文2(4) | Nomaldll修正時、それを参照しているexeのリビルド要否(2) | Nomalデフォルトプロパティを使いたい(6) | NomalAngleSharpのクエリー文(2) | Nomalテキストボックスでの制御(7) | Nomal二次元配列内の文字の置き換え(3) | NomalUSBカメラをピクチャボックスに表示(3) | Nomalcolor型を引数にする方法(2) | NomalEndConnectでのエラー(2) | NomalVSプロジェクト作成方法の違いによる、プラグイン機能を持つアプリケーションへの影響について(6) | Nomalボタンクリック時のLeaveイベントについて(1) | NomalInputボタンが押せない(4) | NomalWebBrowserのDocumentCompletedイベントの切り替え(3) | Nomalorder by で抽出したデータをDataTableに入れてForEachでDataRow取得した際の順番(2) | Nomalエクセルのデータを配列に読込んだ時の配列要素番号について(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追加コントロールのtabindex値を既存の間に設定する方法(1) | Nomal.Net 5.0 におけるDLL参照問題?(7) | NomalVB.net非同期処理でtextboxに出力したい(2) | NomalToolStripStatusLabelの空白部分を埋めたい(2) | NomalOracle への OleDb 接続に失敗する(3) | Nomal正規表現で株価を取得したい(1) | Nomal親スレッドへ処理の移譲(7) | Nomalデザイナで編集・チェックアウトキャンセルすると(3) | NomalVB.NETで作成したDLLをVB6.0から呼び出す(3) | NomalVB.NETからRDゲートウェイを利用したリモートデスクトップ接続(4) | NomalクラスによるGetBytes関数のエンディアンの違い(2) | Nomal.Net 5.0 におけるServiceControllerの代替クラス(3) | Nomal[VB.NET]Excelのプロセスが終了しない(2) | NomalC#をVBに変換した際の強制的な参照渡し(2) | Nomal新たにshowしたフォームでのボタンのクリック(5) | Nomalリッチテキストボックスの文字を太文字にしたい(2) | NomalVB.netにおける固定長出力方法(3) | NomalDataObjectの使いまわし(5) | 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) |



■記事リスト / ▼下のスレッド
■34971 / 親記事)  表の最後の行の下にDropできない
□投稿者/ vett 一般人(1回)-(2021/11/25(Thu) 07:24:16)
  • アイコン環境/言語:[Windows10 64Bit VB.NET .NET Framework4.5] 
    分類:[.NET] 

    ListViewのDetailモードで表形式に表示しています。
    任意のItemを選択してDragDrop動作はできたのですが、
    表の最下部にだけDropできません。
    Drag中に表示される黒い太線(境界線)が最下部に移動しないようです。
    その他のところには問題なく太い黒線表示され移動できています。
    なにか設定が不足しているのでしょうか?

違反を報告
引用返信

▽[全レス1件(ResNo.1-1 表示)]
■34973 / ResNo.1)  Re[1]: 表の最後の行の下にDropできない
□投稿者/ 魔界の仮面弁士 大御所(1413回)-(2021/11/25(Thu) 09:59:24)
  • アイコン
    No34971に返信(vettさんの記事)
    > ListViewのDetailモードで表形式に表示しています。
    WPF にも ASP.NET にも WinForms にも ListView があるんですよね…。
    
    "Detail" というのは、
    "Details" のことでしょうか。
    
    とりあえず WinForms 版 ListView の Views プロパティのことだと仮定します。
    
    
    > 任意のItemを選択してDragDrop動作はできたのですが、
    どのようにしてそれを実装したのかを明示して頂かないと、
    問題点を指摘しにくいです…(想像で補って回答せねばならない)。
    
    
    > 表の最下部にだけDropできません。
    > Drag中に表示される黒い太線(境界線)が最下部に移動しないようです。
    WinForms 版 ListView だとした場合、
    .InsertionMark.AppearsAfterItem の切り替え部をどのように実装していますか?
    
    
    サンプルを書いてみました。手抜き実装ですが。
    
    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            ListView1.BeginUpdate()
            ListView1.AllowDrop = True
            ListView1.View = View.Details
            ListView1.GridLines = True
            ListView1.FullRowSelect = True
            ListView1.Columns.Clear()
            ListView1.Columns.Add("Name")
            For Each f In System.IO.Directory.GetDirectories("C:\Program Files")
                ListView1.Items.Add(System.IO.Path.GetFileName(f))
            Next
            ListView1.AutoResizeColumn(0, ColumnHeaderAutoResizeStyle.ColumnContent)
            ListView1.EndUpdate()
        End Sub
    
        Private Sub ListView1_ItemDrag(sender As Object, e As ItemDragEventArgs) Handles ListView1.ItemDrag
            ListView1.DoDragDrop(e.Item, DragDropEffects.Move)
        End Sub
    
        Private Sub ListView1_DragEnter(sender As Object, e As DragEventArgs) Handles ListView1.DragEnter
            e.Effect = e.AllowedEffect
        End Sub
    
        Private Sub ListView1_DragLeave(sender As Object, e As EventArgs) Handles ListView1.DragLeave
            ListView1.InsertionMark.Index = -1
        End Sub
    
        Private Sub ListView1_DragDrop(sender As Object, e As DragEventArgs) Handles ListView1.DragDrop
            Dim targetIndex = ListView1.InsertionMark.Index
            If targetIndex = -1 Then
                Return
            ElseIf ListView1.InsertionMark.AppearsAfterItem Then
                targetIndex += 1
            End If
            Dim draggedItem = DirectCast(e.Data.GetData(GetType(ListViewItem)), ListViewItem)
            ListView1.Items.Insert(targetIndex, DirectCast(draggedItem.Clone(), ListViewItem))
            ListView1.Items.Remove(draggedItem)
        End Sub
    
        Private Sub ListView1_DragOver(sender As Object, e As DragEventArgs) Handles ListView1.DragOver
            Dim targetPoint = ListView1.PointToClient(New Point(e.X, e.Y))
            Dim targetIndex As Integer = ListView1.InsertionMark.NearestIndex(targetPoint)
            If targetIndex > -1 Then
                Dim itemBounds = ListView1.GetItemRect(targetIndex)
                ListView1.InsertionMark.AppearsAfterItem = targetPoint.Y > itemBounds.Top + itemBounds.Height \ 2
            End If
            ListView1.InsertionMark.Index = targetIndex
        End Sub
    End Class

違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34967 / 親記事)  Cookieの勉強を始めました。
□投稿者/ Wan 一般人(48回)-(2021/11/21(Sun) 14:14:56)
  • アイコン環境/言語:[Windows10 VisualStudio2019 VB.net WindowsForm] 
    分類:[.NET] 

    (質問1)
    Cookieが、サーバからのSet-cookieで送られてきたものを、Webブラウザーで、所定のフォルダー(・・・・\User Data\Default)内に、Cookieというファイル名で、QSLiteデータベースで保存されていることまで調べました。しかし、DB Browse(SQLite)などでデータを見ると、 名前、コンテンツ、ドメイン、パス、送信、スクリプトにアクセス可能、作成済み、有効期限の内、一部の平文が見当たらりません。どうも?暗号化されているようですが、平文に戻す方法ってあるのでしょうか?それとも、別のファイルに保存されているのでしょうか?ブラウザーの設定で見ると、暗号を解除して平文化されているので、何らかの手段で変換しているのかな?と推測しています。
    (質問2)
    サーバから送られてくるSet-cookieのタイミングについてです。ブラウザーの設定で、Dobon.netのCookiesを削除して、Dobon.netにアクセスした場合の要求ヘッダーには、当然Cookieは含まれていません。これは、開発者ツールのネットワークでdobon.netのファイルを選択してヘッダーを選択して確認しています。ところが、応答ヘッダーにSet-cookieの文が存在しません。もう一度、Dobon.netにアクセスすると要求ヘッダーにCookieが含まれています。どこかで、Set-cookieの指示があったと思うのですが、そのファイルをみつけることができません。どのようにすれば、見つけることが出来るのでしょうか?
    詳しい方、ご指南のほど、よろしくお願い致します。

違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34969 / ResNo.1)  Re[1]: Cookieの勉強を始めました。
□投稿者/ Hongliang 大御所(612回)-(2021/11/21(Sun) 14:51:37)
  • アイコンCookieをローカルにどう保存するかは、保存するアプリケーション次第なので、使用されているブラウザが分からないと回答できません。
    Chromium系のブラウザであれば以下のような仕組みで暗号化されています。
    https://qiita.com/taizan_hokuto/items/bff1a1ccd65655e1c386
    .NETにおいては、System.Security.Cryptography名前空間に暗号系のライブラリが用意されています。
    DPAPIはProtectedDataクラス、AES-GCMはAesGcmクラスが対応しています。
    といってもAesGcmは.NET Frameworkではサポートされていないようので、その場合どうするのかは存じません。

    DOBON.NETがどうやってるかは知りませんが、例えばJavaScriptからでもCookieは設定できたりします。
違反を報告
引用返信
■34970 / ResNo.2)  Re[2]: Cookieの勉強を始めました。
□投稿者/ wan 一般人(3回)-(2021/11/21(Sun) 20:15:54)
  • アイコンHongliang様
    早速のご指南有難う御座います。
    大変助かりました。
    Set-cookieの件は、Set-cookieに書かれている内容がそのままSQLiteファイルに書かれているのか?を確認しておこうという意味で質問させて頂きました。
    JavaScriptからでも書けるんですね。深堀してみます。
    何か?検索するツールがあるのかな?って思ったのですが、無いようなのでネットワークをもう少し調べてみます。
    また、暗号の件は、セキュリティの関係上暗号化されているの理解しました。また、頑張れば、復号も可能であることも理解しました。
    もう少し先の話になると思いますが、サーバー側の勉強も始めたいと思います。
    本当に、いつも助かります。有難う御座いました。

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

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34953 / 親記事)  複数のPageに分かれる場合のスクレ―ピング
□投稿者/ Wan 一般人(45回)-(2021/11/13(Sat) 17:08:43)
  • アイコン環境/言語:[Windows10 VisualStudio2019 VB.net WindowsForm] 
    分類:[.NET] 

    Webで複数のPageに分かれたデータをWebClientを使用してデータを取得して、それぞれのPage数と合致したTextBox.Nameに表示しようとしています。(今回は、階層的にtaxtBoxのControlが配置しているので、子も検索するコードになっています)I/O待ちが主体の処理なので、Parallelで回すのでは無く、WebClient.OpenReadAsyncで処理するのが最適と思い次のようなコードを書きました。
    Public Class Form1
        Private Sub onBinaryLoad(ByVal sender As Object, ByVal e As OpenReadCompletedEventArgs)
            If Not (e.[Error] IsNot Nothing) OrElse (e.Cancelled) Then
                DirectCast(Me.Controls.Find("TextBox" & e.UserState, True).First, TextBox).Text = New StreamReader(e.Result).ReadToEnd
            End If
        End Sub
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim 変数Max As Integer = 16
            For i = 1 To 変数Max
                Dim TmpWc = New WebClient
                AddHandler TmpWc.OpenReadCompleted, AddressOf onBinaryLoad
                TmpWc.OpenReadAsync(New Uri("https://XXXX&page=" & i), i)
            Next
        End Sub
    End Class
    提示したコードでは、Page数が16と限定していますが、実際は、不定です。
    
    不定数となる全てのPageの読み込みが完了した判断は、どのように行えば宜しいのでしょうか?
    詳しい方、いらっしゃいましたらご指南宜しくお願い致します。
    
    

違反を報告
引用返信

▽[全レス6件(ResNo.2-6 表示)]
■34955 / ResNo.2)  Re[2]: 複数のPageに分かれる場合のスクレ―ピング
□投稿者/ Wan 一般人(46回)-(2021/11/13(Sat) 22:47:00)
  • アイコン早速の御指南有難うございます!
    文章力が無く、質問の本質を伝えられず、お手数をお掛けして申し訳ありません!最大ページ数の取得方法の質問では無く、最大ページ数が、仮に16とした場合のコードを示したつもりでしたが、ベテラン様から見ると、最大ページ数の取得方法についての質問に見えると言う事は、プログラミングとしてでは無い意味で勉強になります!最大ページ数は、把握出来る環境にあります!webclientの非同期を実行した時に、コンプリートイベントが、複数発行される場合、全ての非同期処理が、全て完了した事を把握する事は出来ますか?
    仮に、最大ページ数が、16だった場合にどの様に全ての非同期処理が完了した事をが検出出来るのか?御指南頂ければ幸いです!
    文章力が無い為、意図が伝わらないかも?
    また、英単語のカタカナ表記については、発音の関係上、厳密な表記は不可能な事から、日本人ならこの程度は、伝わるだろうと、相手の事を考えずに書いた事をお詫び致します!
    なんだか?本質を外れたやり取りになってしまった気もしますが、お気を悪くなされる事が無い事を節に願います!


違反を報告
引用返信
■34956 / ResNo.3)  Re[3]: 複数のPageに分かれる場合のスクレ―ピング
□投稿者/ Wan 一般人(47回)-(2021/11/14(Sun) 11:58:44)
  • アイコン
    次のようなコードで自己解決しました。
    お騒がせしてすみませんでした。
      Private Sub onBinaryLoad(ByVal sender As Object, ByVal e As OpenReadCompletedEventArgs)
            If Not (e.[Error] IsNot Nothing) OrElse (e.Cancelled) Then
                DirectCast(Me.Controls.Find("TextBox" & e.UserState, True).First, TextBox).Text = New StreamReader(e.Result).ReadToEnd
            End If
        End Sub
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            ServicePointManager.DefaultConnectionLimit = 8
            Dim 変数Max As Integer = 16
            Dim WcList As New List(Of WebClient)
            For i = 1 To 変数Max
                Dim TmpWc = New WebClient
                WcList.Add(TmpWc)
                AddHandler TmpWc.OpenReadCompleted, AddressOf onBinaryLoad
                TmpWc.OpenReadAsync(New Uri("https:XXXX&page=" & i), i)
            Next
            Do
                Application.DoEvents()
            Loop Until WcList.All(Function(n) n.IsBusy = False)
        End Sub

解決み!
違反を報告
引用返信
■34957 / ResNo.4)  Re[4]: 複数のPageに分かれる場合のスクレ―ピング
□投稿者/ 魔界の仮面弁士 大御所(1408回)-(2021/11/15(Mon) 11:28:52)
  • アイコンNo34956に返信(Wanさんの記事)
    > Dim TmpWc = New WebClient

    WebClient は幾つかの理由により、現在は非推奨なクラスとなっています。
    https://docs.microsoft.com/en-us/dotnet/api/system.net.webclient?view=netframework-4.8
    https://docs.microsoft.com/ja-jp/dotnet/core/compatibility/networking/6.0/webrequest-deprecated

    >> Important
    >> We don't recommend that you use the WebClient class for new development. Instead, use the System.Net.Http.HttpClient class.

    代わりに HttpClient を使えば、Task ベースの非同期実装を利用できるので、
    WhenAll を使って「全てのページが終わった後」の処理を簡単に書けます。


    取りあえず今回は WebClient で行くとして…。


    > If Not (e.[Error] IsNot Nothing) OrElse (e.Cancelled) Then
    二重否定文になっていますので、打ち消して
    「If e.Error Is Nothing OrElse e.Cancelled Then」
    と書いた方が素直だと思います。

    でも、この判定処理はそもそもおかしく無いでしょうか。もしかして、
    「If Not (e.Error IsNot Nothing OrElse e.Cancelled) Then」あるいは
    「If e.Error IsNot Nothing AndAlso Not e.Cancelled Then」と書きたかったのでは?


    > Do
    >  Application.DoEvents()
    > Loop Until WcList.All(Function(n) n.IsBusy = False)
    これだと、ループ中に再度ボタンが押されてしまうこともありそうです。

    なによりも、「イベント通知型」の非同期実装であるにもかかわらず、
    それをループ待機してしまっては台無しです。

    ループ待機で「Loop Unitil 最後のページのイベント処理が完了した時」とするのではなく、
    OpenReadCompleted イベントのハンドラーである onBinaryLoad にて、
      If 最後のページのイベント処理が完了した時 Then
        '全て完了した時に動作させたい処理
      End If
    のように実装するようにして、Button1 そのものは
    ループ待機せず、そのまま End Sub に向かって抜けてしまうようにします。


    今回の場合、OpenReadAsync 時に UserToken として 1〜16 の固有値を
    渡しているわけですから、onBinaryLoad 側では CInt(e.UserState) を通じて
    何ページ目のロードが完了したのかも分かるはずですよね。
解決み!
違反を報告
引用返信
■34958 / ResNo.5)  Re[5]: 複数のPageに分かれる場合のスクレ―ピング
□投稿者/ 魔界の仮面弁士 大御所(1409回)-(2021/11/16(Tue) 10:49:26)
  • アイコンNo34957に追記(魔界の仮面弁士の記事)
    > WebClient は幾つかの理由により、現在は非推奨なクラスとなっています。
    > 代わりに HttpClient を使えば、Task ベースの非同期実装を利用できるので、
    > WhenAll を使って「全てのページが終わった後」の処理を簡単に書けます。

    HttpClient + WhenAll のサンプルです。

    "cbbs.cgi?page=-20" 〜 "cbbs.cgi?page=80" までの 6 ページを読み込むので
    Multiline = True な TextBox を 6 個と Button1 を用意してください。


    Option Strict On
    Imports System.Net.Http
    Public Class Form1
      Private textBoxes As New List(Of TextBox)()

      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        textBoxes.AddRange({TextBox1, TextBox2, TextBox3, TextBox4, TextBox5, TextBox6})
      End Sub

      Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Button1.Enabled = False

        Dim queue As New List(Of Task)()
        For p = 0 To 5
          Dim url = $"https://dobon.net/cgi-bin/vbbbs/cbbs.cgi?page={20 * (p - 1)}&H=F&no=0"
          Dim txt = textBoxes(p)
          Dim http As New HttpClient()
          queue.Add(http.GetStringAsync(url).ContinueWith(
            Sub(html) txt.Text = $"{url}{vbCrLf}{html.Result}",
            TaskScheduler.FromCurrentSynchronizationContext()))
        Next
        Await Task.WhenAll(queue)

        Button1.Enabled = True
      End Sub
    End Class
違反を報告
引用返信
■34968 / ResNo.6)  Re[6]: 複数のPageに分かれる場合のスクレ―ピング
□投稿者/ Wan 一般人(49回)-(2021/11/21(Sun) 14:22:24)
  • アイコン追加で、丁寧なご説明ありがとうございます。
    継続タスク、スケジュールなどの要素が含まれており物凄く勉強になりました。
    なんとなくですが、Taskという考え方、HttpClientが4.5から追加されて意味が見えてきたような気がしています。
    非同期処理は、始めたばかりなのでわからないことだらけで、くだらない質問ばかりで申し訳ありません。
    本当に有難うございました
解決み!
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34964 / 親記事)  DataGridViewの特定セルにボタンを配置する方法
□投稿者/ り 一般人(4回)-(2021/11/17(Wed) 16:05:58)
  • アイコン環境/言語:[C#] 
    分類:[.NET] 

    画像のような表を作成したいのですが、
    特定のセルにのみボタンを配置することは可能でしょうか。
548×394 => 250×179
イメージ
IMAGE.png
/6KB
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34965 / ResNo.1)  Re[1]: DataGridViewの特定セルにボタンを配置する方法
□投稿者/ 魔界の仮面弁士 大御所(1411回)-(2021/11/17(Wed) 18:12:54)
  • アイコンNo34964に返信(りさんの記事)
    > 画像のような表を作成したいのですが、
    > 特定のセルにのみボタンを配置することは可能でしょうか。

    dataGridView1[0, 0] = new DataGridViewButtonCell { UseColumnTextForButtonValue = true };
違反を報告
引用返信
■34966 / ResNo.2)  Re[2]: DataGridViewの特定セルにボタンを配置する方法
□投稿者/ り 一般人(5回)-(2021/11/19(Fri) 08:52:28)
  • アイコンNo34965に返信(魔界の仮面弁士さんの記事)
    > ■No34964に返信(りさんの記事)
    >>画像のような表を作成したいのですが、
    >>特定のセルにのみボタンを配置することは可能でしょうか。
    >
    > dataGridView1[0, 0] = new DataGridViewButtonCell { UseColumnTextForButtonValue = true };

    返信遅くなりました。
    早急に回答していただきありがとうございます!
    しかし、私の理解不足だと思うのですが、これだけでは実現できませんでした。
    他に記述すべき内容がありましたら、教えていただきたいです...
違反を報告
引用返信

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



■記事リスト / ▲上のスレッド
■34959 / 親記事)  DataGridViewのセル結合部分にボタンを表示する方法
□投稿者/ り 一般人(1回)-(2021/11/16(Tue) 12:03:00)
  • アイコン環境/言語:[C#] 
    分類:[.NET] 


    初めて投稿させていただきます。

    タイトルの通りの内容ですが、
    CellPaintハンドラでセルを結合しているように表示させて、
    結合したセルの中にボタンを配置したいのですが、

    現在のソースは、DBからデータを抽出してDataGridViewに表示しようとしているので、
    DataGridView.DataSouced = dt;
    でデータを格納し、そのあとにCellPaintが動く形で記述しています。

    しかし、それだとボタンがTextの形で表示されてしまいボタンとしての機能が
    失われていしまいます。

    どうにかいい方法はないでしょうか...
    添付のようにしたいです。

665×235 => 250×88
イメージ
1637031780.png
/5KB
違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■34960 / ResNo.1)  Re[1]: DataGridViewのセル結合部分にボタンを表示する方法
□投稿者/ 魔界の仮面弁士 大御所(1410回)-(2021/11/16(Tue) 13:04:37)
  • アイコンNo34959に返信(りさんの記事)
    > でデータを格納し、そのあとにCellPaintが動く形で記述しています。
    描画先となる該当セルのインスタンスは、どのようなデータ型にしていますか?

    DataGridViewButtonCell あるいはその継承クラスなのか、
    DataGridViewTextBoxCell あるいはその継承クラスなのか、
    それとも素の DataGridViewCell クラスから実装しているのか。


    > しかし、それだとボタンがTextの形で表示されてしまい
    どういうコードを書いているのか、一切の説明が無いので
    状況が分からないです。

    ボタンセルということは、そもそもユーザーによる編集は
    不要なのですから、Text を選択できるようにしておく必要もないのですよね。

    > ボタンとしての機能が失われていしまいます。
    具体的には、どういう結果を期待しているのに、
    実際にはどうなってしまうのでしょうか?
違反を報告
引用返信
■34961 / ResNo.2)  Re[2]: DataGridViewのセル結合部分にボタンを表示する方法
□投稿者/ り 一般人(2回)-(2021/11/16(Tue) 13:31:41)
  • アイコンNo34960に返信(魔界の仮面弁士さんの記事)

    迅速に回答くださりありがとうございます!
    説明不足ですみません。

    > ■No34959に返信(りさんの記事)
    >>でデータを格納し、そのあとにCellPaintが動く形で記述しています。
    > 描画先となる該当セルのインスタンスは、どのようなデータ型にしていますか?
    >
    > DataGridViewButtonCell あるいはその継承クラスなのか、
    > DataGridViewTextBoxCell あるいはその継承クラスなのか、
    > それとも素の DataGridViewCell クラスから実装しているのか。

    DataGridViewButtonCellで実装しようとしています。

    >
    >
    >>しかし、それだとボタンがTextの形で表示されてしまい
    > どういうコードを書いているのか、一切の説明が無いので
    > 状況が分からないです。
    > ボタンセルということは、そもそもユーザーによる編集は
    > 不要なのですから、Text を選択できるようにしておく必要もないのですよね。

    コードは次に記載します。

    >>ボタンとしての機能が失われていしまいます。
    > 具体的には、どういう結果を期待しているのに、
    > 実際にはどうなってしまうのでしょうか?



    実装したいイメージは先ほど挙げている通りですが、
    現状は今回添付したファイルのようになります。

570×335 => 250×146
イメージ
1637037101.png
/6KB
違反を報告
引用返信
■34963 / ResNo.3)  Re[3]: DataGridViewのセル結合部分にボタンを表示する方法
□投稿者/ り 一般人(3回)-(2021/11/17(Wed) 09:33:12)
  • アイコンNo34961に返信(りさんの記事)
    現在記述しているコードは以下の感じです。

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace Learning
    {
    public partial class frmGrid : Form
    {

    private string[,] strTitle = new string[,] {
    { "A", "B", "C", "D" },
    { "E", "", "", "F" } };


    /// <summary>
    /// 検索
    /// </summary>
    private void SearchResult()
    {
    DataTable dt = new DataTable();
    string strSql;

    strSql = CreateSql();

    dt = CMNUtil.ExecSql(strSql);
    CreateViewData(dt);

    }


    /// <summary>
    /// DataGridView作成
    /// </summary>
    /// <param name="dt"></param>
    private void CreateViewData(DataTable dt)
    {
    DataLoad(dt);
    AttachHeaderEvent();
    }

    /// <summary>
    ///
    /// </summary>
    /// <param name="dt"></param>
    private void DataLoad(DataTable dt)
    {
    DataTable vwDt = new DataTable();
    DataRow row;
    vwDt = CreateColumn();
    string[] strCol = new string[dt.Columns.Count - 1];

    for (int i = 0; i < 2; i++)
    {
    //ヘッダー用
    row = vwDt.NewRow();
    row["A"] = SetData(null, 0, i, true);
    row["B"] = SetData(null, 1, i, true);
    row["C"] = SetData(null, 2, i, true);
    row["D"] = SetData(null, 3, i, true);
    vwDt.Rows.Add(row);
    }


    foreach (DataRow dr in dt.Rows)
    {
    for (int i = 0; i < 2; i++)
    {

    row = vwDt.NewRow();
    row["A"] = SetData(dr, 0, i);
    row["B"] = SetData(dr, 1, i);
    row["C"] = SetData(dr, 2, i);
    row["D"] = SetData(dr, 3, i);
    vwDt.Rows.Add(row);
    }
    }
    dataGridView1.DataSource = vwDt;
    DataGridViewButtonColumn btnSel = new DataGridViewButtonColumn();
    btnSel.Name = "btnSelect";
    btnSel.UseColumnTextForButtonValue = true;
    btnSel.Text = "選択";
    btnSel.HeaderText = string.Empty;
    dataGridView1.Columns.Insert(0, btnSel);

    }


    /// <summary>
    /// イベントハンドラ作成
    /// </summary>
    private void AttachHeaderEvent()
    {
    dataGridView1.CellPainting += (s, e) =>
    {

    DataGridView dv = (DataGridView)s;
    Rectangle rect;
    DataGridViewCell cell;

    rect = e.CellBounds;
    int intWidth = 0;

    if (e.ColumnIndex == 0)
    {
    if (e.RowIndex % 2 == 0)
    {
    cell = dataGridView1[e.ColumnIndex, e.RowIndex + 1];
    //1つ下のセルの高さを足す
    rect.Height += cell.Size.Height;
    }
    //偶数行の処理
    else
    {
    cell = dataGridView1[e.ColumnIndex, e.RowIndex - 1];
    //一つ上のセルの高さを足し、矩形の座標も一つ上のセルに合わせる
    rect.Height += cell.Size.Height;
    rect.Y -= cell.Size.Height;
    }
    //セルボーダーライン分矩形の位置を補正
    rect.X -= 1;
    rect.Y -= 1;
    //背景、セルボーダーライン、セルの値を描画
    e.Graphics.FillRectangle(
    new SolidBrush(e.CellStyle.BackColor), rect);
    e.Graphics.DrawRectangle(
    new Pen(dv.GridColor), rect);
    TextRenderer.DrawText(e.Graphics, cell.FormattedValue.ToString(), e.CellStyle.Font, rect, e.CellStyle.ForeColor, TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter);
    e.Handled = true;
    }

    //2列目と3列目の結合処理
    else if (e.ColumnIndex == 1)
    {
    if (e.RowIndex % 2 == 0)
    e.Paint(e.ClipBounds, e.PaintParts);
    else
    {
    rect = e.CellBounds;
    for (int i = 0; i < 3; i++)
    {
    cell = dataGridView1[e.ColumnIndex + i, e.RowIndex];
    intWidth += cell.Size.Width;
    }
    rect.Width = intWidth;
    rect.X -= 1;
    rect.Y -= 1;

    e.Graphics.FillRectangle(new SolidBrush(e.CellStyle.BackColor), rect);

    e.Graphics.DrawRectangle(new Pen(dv.GridColor), rect);

    TextRenderer.DrawText(e.Graphics, e.FormattedValue.ToString(),
    e.CellStyle.Font, rect, e.CellStyle.ForeColor,
    TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter);
    e.Handled = true;
    }
    }
    else
    {
    if ((e.ColumnIndex != 1 && e.ColumnIndex != 4) && e.RowIndex % 2 != 0)
    e.Handled = true;
    }
    //2段目を結合しているように見せる
    if (e.RowIndex == 1 && e.ColumnIndex < 3)
    {
    e.AdvancedBorderStyle.Left = DataGridViewAdvancedCellBorderStyle.None;
    e.AdvancedBorderStyle.Right = DataGridViewAdvancedCellBorderStyle.None;

    if (e.ColumnIndex < dataGridView1.Columns.Count - 1 && Convert.ToString(dataGridView1.Rows[1].Cells[e.ColumnIndex + 1].Value) != "")
    e.AdvancedBorderStyle.Right = DataGridViewAdvancedCellBorderStyle.Single;
    }


    SetGridStyle();
    };



    }

    /// <summary>
    /// Headerの設定
    /// </summary>
    private void SetGridStyle()
    {
    //GridViewの色等の設定を記述
    }



    /// <summary>
    /// DataRowに値格納
    /// </summary>
    /// <param name="dr">DataRow</param>
    /// <param name="col">列番号</param>
    /// <param name="row">行番号</param>
    /// <param name="flg">フラグ(ヘッダー判別用)</param>
    /// <returns></returns>
    private string SetData(DataRow dr, int col, int row, bool flg = false)
    {
    //とってきた値を格納
    }



    /// <summary>
    /// 表示用データテーブル作成
    /// </summary>
    /// <returns></returns>
    private DataTable CreateColumn()
    {
    DataTable retDt = new DataTable();

    retDt.Columns.Add("A", typeof(string));
    retDt.Columns.Add("B", typeof(string));
    retDt.Columns.Add("C", typeof(string));
    retDt.Columns.Add("D", typeof(string));

    return retDt;
    }

    }

違反を報告
引用返信

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






Mode/  Pass/


- Child Tree -

2021/11/28(Sun) 00:00:19 に作成されたキャッシュを表示しています。
生のデータを表示する | キャッシュを最新にする