• ベストアンサー

C# ReadOnlyのTextBoxで

お世話になります。 C#でテキストボックスを、ReadOnlyで配置する際、 フォーカスが移るとカーソル(キャレット)が表示されてしまいます。 過去ログなどで調べた結果、WindowsAPIを使うしかないと 過去の情報にはあったのですが、この問題は.Netの最新の 4.5(?)現在でも、それに見合ったメソッドは実装されていませんか? 今でもまだ、APIを使用しなければ駄目でしょうか。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

されていません。 無効であることと意味が異なりますので。 大体日本だと、こういうのがありますよね。  ・Enabled=falseでいいじゃん   ⇒背景色、文字色が濃くなって、見辛いのでNG  ・ReadOnly=true、TabStop=falseでいいじゃん   ⇒背景色変わってほしくない、マウスでフォーカスがあたるのでNG  ・ラベルで表現すればいいじゃん   ⇒情報のコピーを行うことができなくなるのでNG よほど神経質でない限り、どちらかでいいのでしょうが、いちいちどうでもいい細かいところに 拘りたがります。 そういうの、ある特定条件下において入力可能/不可能が切り替わる時に、大変拘りだすと 思います。 結論は自作するしかありません。 WindowsAPIで実現する方法論は知りませんでしたが、私はOnReadOnlyChangedをオーバーライドして コンポーネントを自作しましたよ。 加えて、ReadOnlyFocusApplyプロパティみたいなのを作って、trueならただのReadOnly状態、 falseならラベルで表現する、とかってしました。 先に記した状態3つがあるわけですが、ユーザーがどのレベルまで求めているのかによって 対応策が異なると思います。 ⇒フォーカスが遷移しないのにWindowsの基本操作に従った手順でコピーは行いたいなんてのは  ムリなので。

tatapatank
質問者

補足

回答、ありがとうございます。 そんな大したことを望んでいるわけではないのですが…。 要はReadOnlyであろうとなかろうと、『カーソルをみえなくできれば』 良いのでして。 極端な話思いついたのは、カーソルと背景色を同じにできれば 見えなくできると思っていたのですが、それらしいのもないみたいでした。 実際にカーソルが存在していてもいいんです。要は見た目に気づかなければ 良いのですが、そんな方法はありますでしょうか?

その他の回答 (4)

  • nak777r
  • ベストアンサー率36% (49/136)
回答No.5

>今でもまだ、APIを使用しなければ駄目でしょうか。 そもそも、「今でもまだ」とは、どういう意味でしょう Readonly属性は、入力コントロールに対する変更を禁止にするだけの属性です そして、入力コントロールなのですからキャレットが存在して当たり前です キャレットの主な役割は、移動、変更、コピー&ペーストがあります このうち、変更が禁止になっただけなので、移動とコピーのみが出来ますよ という属性です 「今でもまだ」、まるでこの仕様が不具合で、まだ直っていないとでも 言いたそうですが、もともとがそういう仕様なのですから 今でもまだ、どころか、この先も変わる事は無いです

tatapatank
質問者

補足

回答、恐れ入ります。 決して不具合だとは思っていません。 要は、機能的にあろうとなかろうと、『キャレットを非表示にする』という メソッドなりが追加されていてもおかしくないのではと思っただけです。 皆様の回答を見ていると、必要以上にこだわりのある 返答のように思えますが、私としては見えなくなってさえくれればいいわけで 当然そのようなメソッド、機能していても非表示にするとか、 キャレットと背景色を同じにするとか。 なので、非表示と無効というのを取り違えて回答するのはやめていただきたく存じます。

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.4

>『できるようになったのかどうか』という内容に、『LAbelで代用しろ』とは、 > 意図そのものが違っているのでは? そういう事であれば、できませんし将来的にもできるようにはならないと思います。

回答No.3

> 実際にカーソルが存在していてもいいんです。要は見た目に気づかなければ > 良いのですが、そんな方法はありますでしょうか? それは入力可能になる場合がある項目なのでしょうか? そうでないならば、やはりラベルで代用することが最も簡単でしょう。 そもそもフォーカスが当たらなければ良いわけですから。 もしくは、一度フォーカスが当たってもいいなら、フォーカスが当たった瞬間に form.ActiveControl=nullにするとか。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

「TeextBoxの内容を選択してクリップボードにコピー」という動作を許可する為にはReadOnlyでもキャレットが必要です。 ということで……ReadOnlyで配置する目的はなんでしょう? Labelで配置ではダメなのでしょうか? 文字色や背景色まで変わってしまいますがEnabledプロパティで無効状態にしてしまう。というのもあるかも知れません。

tatapatank
質問者

補足

すみません。 せっかく回答いただけたのに、質問の意味がお分かりいただけてないようです。 『できるようになったのかどうか』という内容に、『LAbelで代用しろ』とは、 意図そのものが違っているのでは? >「TeextBoxの内容を選択してクリップボードにコピー」という動作を許可する ということを書いてはいないつもりですが、この文章はどこから出てきたのですか?

関連するQ&A

  • DataGridのReadOnlyについて

    こんにちは いつもお世話になっております。 VB.NET(2003)で、DataGridにデータを表示して、編集-更新する処理を行っています。 表示ボタンを押したら表示され、更新ボタンで更新される動作です。 表示方法はDataGridTextBoxColumnのReadOnly=TrueにしたものをDataTableにADDし、 これをDataGrid.DataSourceにセットして表示させています。 そして、クリアボタン押したときに dtb = New DataTable 'グリッドに表示 DataGrid.DataSource = dtb というようにDataTableを初期化してクリアしているのですが このときDataGrid上のTextBoxにカーソルがあると そのTextがクリアされず表示されたままになってしまいます。 ReadOnlyですが、一応カーソルは当たるようにしたいのです。 表示されたままになっているのは、クリアの方法がまずいのでしょうか? すみませんが、どなたか教えていただけませんでしょうか?

  • C# TextBoxをもつフォームが非アクティブ

    お世話になります。 C#にて、付箋紙の様な簡易メモ帳を作ろうとしています。 フォーム上にテキストボックスを配置し、テキストを入力後、 そのフォームが非アクティブになった時、つまり、デスクトップや 他のウインドウに切り替わった瞬間に(フレームの色が変わった時) 自動保存させたいと思うのですが、なかなかうまくいきません。 方法をお教えください。 尚、現在はLeaveイベントで取得しようとしてみましたが、 フォーム内では発生しますが、違うウインドウに切り替えただけだと 発生しません。 以上、よろしくお願いいたします。

  • JavaScriptでこれ出来ますか?

    すでに文字列が入っているテキストボックスにfocus()を行い、 "I"の形の文字キャレットを文字列の最後に移動させたいのですが、 ただ単に document.getElementById("TextField").focus() などとすると、文字列の最初に文字キャレットがいってしまいます。 どのようにしたら文字列の最後に文字キャレットを移動させられ ますでしょうか?

  • TextBoxのhWndプロパティVBAでも使えませんか?

    環境 OS:Win2000ProSP4 Excel2000および2002 Excel2000で、テキストボックスのあるフォームを作成しました。 選択したファイルを読み込んでテキストボックスに表示する機能があり それに加えて、テキストボックス中をマウスでクリックした時、その場 所のカーソルの位置(そこの行数と行内で何カラム目か、の2つ)を取得し て同じフォーム上に表示させる機能をつけました(矢印ボタンでカーソ ルが移動しても、位置情報を更新するようにしています)。ただし、 ネットで調べたカーソル位置取得方法はVBAでなくてVBのものなので、 API(SendMessage)に渡すテキストボックスのhWndプロパティはなく、 困ってしまいました。窮余の一策として、普通のテキストボックスの 代わりに、リッチテキストコントロールを使用して、その中にある hWndプロパティを渡して、上の機能を実現していました。ところが、 Excelを2002にアップグレードしたら、リッチテキストコントロール が使えないことが判明しました(MSのサイトによると、セキュリティの ため、とのこと)。 Excel2002で、2000時代につくったフォームを開くと、リッチテキスト コントロールがすっぽり抜け落ちている状態です。こうなれば、普通の テキストボックスのhWndプロパティをAPIで取得できないか、というこ とを調べているところで困っています。あるいは、2002でも使える同じ ようなコントロールがあれば助かります。 長くなりましたが、ご存知の方、アドバイスをお願いします。

  • C# テキストボックスについて

    フォームに置いたテキストボックスに フォーカスを入れると カーソルが点滅するごとに,オーバーライドした OnPaintのハンドラーにイベントが引っかかります。これは当然のことなのでしょうか? カーソルが点滅したぐらいでPaint処理をするのはわずらわしいし不都合がある場合があります。 なので,イベントが引っかからない(起きない)ようにするか,または OnPaintハンドラー内において Paintイベントが起きたのはテキストボックスであるということを知る方法はないのでしょうか。

  • メッセージボックスの表示位置について

    WindowsAPI(C言語)でメッセージボックスの表示位置を変更したいと思っています。 ダイアログボックスはSetWindowPosで変更できたのですが、メッセージボックスの表示位置が変更できずに困っています。 何か良いAPIや、実装方法などがありましたらご教授ください。 よろしくお願いします。

  • NumericUpDownでキャレット移動

    VB.NET VisualStudio2017でWindowsアプリケーションを開発しています。 お客様からの要望でテキストボックスがフォーカスが移った際には入力済の文字列を全選択し、その状態で文字列の任意の場所でマウスをクリックするとその場所にマウスカーソル(キャレット)を移動しています。 Private Sub txtTest_MouseDown(sender As Object, e As MouseEventArgs) ' マウスを押した位置にキャレットを移動する Dim charIndex As Integer = txtTest.GetCharIndexFromPosition(e.Location) txtTest.Select(charIndex, 0) End Sub 同様のことをNumericUpDownコントロールで行いたいのですが、NumericUpDownコントロールにはGetCharIndexFromPositionメソッドが存在しません。 Windows API のSendMessageも調査してみましたが、TextBox向けの事例にしかヒットしませんでした。 何か良い方法をご存知の方がいらっしゃれば、お知恵をお借りしたく存じます。 よろしくお願いいたします。

  • アクセスのTextBox内で改行できるようにしたい

    過去ログをhttp://okwave.jp/qa4812389.html 参考にしてみましたがアクセスのテキストボックスで出来ません。 ”あああ”のあとにエンターキーを押しても何も変わりません。 TextBoxのプロパティを見ても”改行”というのが見つかりません。 どうすれば改行できますか?よろしくお願いします。

  • スマホで文字入力画面を表示させたくない(html)

    input要素のテキストフィールド<input type="text">にフォーカスしたとき、スマホの文字入力画面を表示してほしくないのですが、なにか方法はありますか? 端末側で設定するのではなく、Webサイト側で制御したいのです。 input要素をreadonlyやdisabledにすれば表示されませんが、そうしてしまうとキャレットを制御できなくなってしまうため、だめでした。 キャレットは制御できるけど文字入力画面はでない。なんて方法、ご存知のかたいらっしゃいませんか?

  • EXCEL VBA カーソル移動方法?

    エクセル2000でユーザーフォームを作成し テキストボックス1~6まで作成し テキストボックス1~3を1段目、4~6を二段目で配置した場合 エンターキーでケキストボックス1⇒2・・・6のカーソル移動は わかるのですが、テキストボックス2から下に配置してある テキストボックス5に矢印キー↓でカーソルを動かすようにはどのように すればよろしいのでしょうか? 又、おなじようなことなのですがテキストボックス2から 矢印←でテキストボックス1にカーソルを移動させるのも 同じでしょうか? 宜しくお願いいたします。