none
テキストボックスの選択位置に文字列を追加する RRS feed

  • 質問

  • いつもお世話になります。
    VisualC#2010、WindowsXPでの動作について質問があります。
    テキストボックスの選択位置に文字列を追加するのはどうしたらよいでしょう?
    単に追加するだけならtextBox += addstring;
    とかでよいのですが。
    2011年4月25日 12:22

回答

  • これでどうでしょうか?

    private void button_Click(object sender, RoutedEventArgs e)
            {
                if (textBox.SelectedText.Length == 0)
                    textBox.SelectedText = DateTime.Now.ToString("HH:mm") + "\r\n";
                textBox.Focus();

                textBox.SelectionLength = 0; //なくてもいい
                textBox.SelectionStart = textBox.Text.Length;
             }


    • 回答としてマーク d-kot 2011年4月26日 6:10
    2011年4月26日 3:30

すべての返信

  • 「TextBox 挿入 C#」で検索して、いくつかのページを開いていけばなんとなくわかりませんか?
    わからなかったのであれば、断片的な情報でもよいので自分の理解、推測、失敗事例などを明示してください。

    # 疑問は質問するのではなく、まず自力解決の一歩である検索エンジンを使ってみましょう。
    # 質問はそれでも解決しなかったときに、どこまでわかった、どこまで試したという情報と共に。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年4月25日 13:40
    モデレータ
  • 他には「TextBox カーソル位置」とか。
    2011年4月25日 13:45
  • 単に追加するだけならtextBox += addstring;
    とかでよいのですが。

    ダメです。

    もちろん textBox.Text += addstring;

    でもダメです。よく調べてみてください。

     

    2011年4月25日 14:22
  • テキストボックスのカーソル位置に、ある文字列を挿入するということですか?
    その場合、もしテキストが範囲選択されていたらどうしますか?
    最終的にやりたい事がわかりませんが、以下は、テキストボックスの
    テキストのカーソル位置に文字列を挿入し、もしテキストが範囲選択されている
    場合は、範囲選択分は削除されて文字列が挿入される(置換される感じ)ような
    サンプルです。
    実際にやりたい動作の参考として見てみてください。

    this.textBox1.Text = textBox1.Text.Substring(0, textBox1.SelectionStart)
      + "追加文字"
      + textBox1.Text.Substring(textBox1.SelectionStart + textBox1.SelectionLength);
    
    
    2011年4月26日 2:54
  • Azuleanさん、ありがとうございます。
    totojoさん、ありがとうございます。
    honefaiさん、ありがとうございます。
    やりたいことですが、整理できました。
    テキストボックスのカーソル位置にボタンを押したときに、文字列を挿入しようとしています。
    テキストが選択されていたら動作しないようにします。
    しらべて次のようにしてみました。


    private void button_Click(object sender, RoutedEventArgs e)
            {
                if (textBox.SelectedText.Length == 0)
                    textBox.SelectedText = DateTime.Now.ToString("HH:mm") + "\r\n";
                textBox.Focus();
             }
    これで文字列は挿入できたのですが、フォーカスしたときに挿入した文字列を選択しています。
    フォーカスしたときに文字列の末尾にカーソルが移動するようにしたいのですが、それはどうしたらよいでしょう?
    アドバイスお願いします。

    2011年4月26日 3:18
  • 「TextBox カレット」あたりで検索してみてはいかがでしょうか。
    あるいは、honefai さんの回答を理解すれば、方法は見えてくるように思います。
    2011年4月26日 3:23
  • これでどうでしょうか?

    private void button_Click(object sender, RoutedEventArgs e)
            {
                if (textBox.SelectedText.Length == 0)
                    textBox.SelectedText = DateTime.Now.ToString("HH:mm") + "\r\n";
                textBox.Focus();

                textBox.SelectionLength = 0; //なくてもいい
                textBox.SelectionStart = textBox.Text.Length;
             }


    • 回答としてマーク d-kot 2011年4月26日 6:10
    2011年4月26日 3:30
  • 朴智星さん
    ありがとうございました。これでできました。
    2011年4月26日 6:13
  • コードを書かなかった狙いをあえて書いておきます。

    私は、そのまま使えるコードを提供することが最適とは限らないと考えています。
    (もちろん、これは場合によりまして、コードを提示することによってお互いのコミュニケーションが促進され、本来の疑問にたどり着くといったこともあります)

    コードを提示することは、今困っている疑問に対しては効果を発揮すると思いますが、その疑問を解消するために自ら行動する機会を失い、検索・調査スキルを自ら高める機会を逸してしまいます。
    これによって、今後も疑問をそのままフォーラムに書くことになって、本人にとってもソフトウェアを作る時間が短縮できない(=フォーラムでの回答待ちが発生する)かもしれないと考えています。

    私個人の意見が続きますが、プログラマーなのですから、やはりご自身で解決するという動きを取ってほしいですし、そうすることで自分の力を高めるきっかけを多く生むと期待しています。

    なお、この投稿は私個人がフォーラムに参加していく上で考えていることであって、このスレッドに限らず、特定の質問者が今後どうなるかを断定するものではありません。誤解なきようにお願いします。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。


    2011年4月26日 13:46
    モデレータ
  • Azuleanさん、コメントありがとうございます。
    え~と、わたしは趣味グラマではありますが、本職の(という定義がどういうものかはさておき)プログラマではありません。
    野望は果てしないですが、できることはほとんど初心者クラスです。
    だから、取り混ぜてかなり初歩的なことから、すこしははまっていることまでいろいろ尋ねています。
    ときには、聞いた瞬間に自分で解決できることもありますが、質問するときには、いろいろはまっていて、いずれにせよ自分だけではどうにもならない状況にある、すごく単純なものについて訊くときには、いくつも疑問があって、どうにもならないでいる、という場合が多いです。
    おっしゃるように、場合によりコードがほしいこともありますし、コードを提示していただいても、それをわたしのスキルでは読めない、理解できないということもあります。
    単にヒントだけいただいても解決できることもあります。
    これまたおっしゃるように、場合によりさまざまです。
    調査スキルはおっしゃるとおりで、自慢できるほど高くないことはよくわかるのですが、たとえば今回の場合、キーワードをうまく思い浮かべられない(だからスキルが低い)ということもあります。
    そういうときに、動くコードをいただけば、それを追いかけてスキルを高めることもできると思います。
    『赤毛のアン』で、アンはいつも失敗をしますが、それを指摘されると「おなじ失敗はしていない」と反論します。
    わたしも、アン程度には学習能力があるつもりでいますが、それでも足りないことはいくらもあり、結果として質問が増えます。
    質問を出すことで、議論になればよいなとも思いますが、それはなんともいえません。
    2011年4月26日 15:22
  • 野望は果てしないですが、できることはほとんど初心者クラスです。

    個人的には「初心者」という言葉を自己表現に使ってほしくないと思っています。
    この言葉を使っている方々の中でも能力、経験に差があり、逆質問する、説明する、回答する際に適切な内容を選びかねることがあること、努力しないでよいという免罪符として使われている方がおられることからです。
    下手に 3 文字にせずに何がわかって、何がわからないとか具体的にしてもらった方がよいと思っています。

    調査スキルはおっしゃるとおりで、自慢できるほど高くないことはよくわかるのですが、たとえば今回の場合、キーワードをうまく思い浮かべられない(だからスキルが低い)ということもあります。

    文字列を途中に入れることを「文字列の挿入」という風に表現することを知っているかどうかというところで、確かに経験や知識による差があります。
    こればっかりは、書物や Web ページを多く読んで頂いて、いろいろな知識を獲得して頂くしかないかなぁと思っています。

    ただ、そういった知識獲得の努力を経ても不幸なことにそれに当たらなかったのかどうなのかは、うかがい知ることができません。

    そういうときに、動くコードをいただけば、それを追いかけてスキルを高めることもできると思います。

    確かにそういった手があることを否定しません。
    ただ、フォーラムに参加する方々は質問者の先生ではないので、頼りすぎることのないようにだけ、ご留意ください。
    何でも聞けばいいとなってしまうと、たとえば 1 フォーラムの先頭 10 件が自分の質問で埋まるとかいう、傍目から見ると「なんだこりゃ」と思わせることもあるかもしれません(これはあくまで極端な例にです)。
    自身での体系的な知識の習得、さらに横展開するためにいろいろな書籍を読むといったこと、自分で検索エンジンを活用してみると言ったこと、その他いろいろな努力を経ることを忘れないで頂ければと思います。

    十分に努力された上で解決されなかったのであれば、もちろん質問という方法を採ることはありです。その際、どういった努力をしたかを添えれば、よりよいアドバイスをもらえると思います。たとえば、求める答えだけでなく、その調べ方・やり方の何が悪かったとかも指摘をもらえて、自分のスキル向上に役立つかもしれません。

    質問を出すことで、議論になればよいなとも思いますが、それはなんともいえません。

    ものによりますね。
    そういった考えをしたことがなかったが、確かにそれができると便利だよねとか、それを実現するスマートな方法はないけれども自分がやるならどうするだろうかという議論に発展する可能性はあります。
    ただ、議論に発展したスレッドは、多くのケースにおいて質問者はついてこれなくなるのがよくある話ですが…。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年4月26日 16:26
    モデレータ
  • Azuleanさん、コメントありがとうございます。
    たしかに初心者という言葉で免罪符的に免罪されるとは思っていないので、その点については意見の一致を見ると考えます。初心者という言葉も訊かれて答えただけで、これまでわたしは基本的に使っていないと思います。
    先生でないという点についてもそうだと思います。たとえばわたしは以前にほかの掲示板を使ったこともありますが、そちらではコードは教えない、自力解決のヒントのみという方針のようで、わたしはほとんど役立てることができませんでした。
    それに較べてmsdnのこちらは、コードやヒントが豊富で、わたしにとってはとても居心地がよいです。

    さてそれで体系的な知識についてですが、以前にも書いたかと思いますが、いちおうC#、WPF関係の書籍は入門~中級程度までひととおりそろえてあり、11冊程は目を通しています。かなり読み込んでいるとも思いますが、それでもぜんぶを理解しているかというと、心もとないことが多いです。読めているところはだいぶ感覚をつかめてきたけど、そうでもないところはまだまだ多い、という状況です。
    msdnは読み方がよくわからないことがあって、残念ながら活用できていません。

    検索エンジンについては、まず最初に作ったのが、ソースを検索するソフトで、適宜キーワードで検索しているのですが、キーワードを適切に思いつけないことがあったり、そもそもそういうことを考えているひとがいないときには、うまくヒットしないこともあり、なかなか思うに任せないことがあります。コード例が古くて現状で使えないとか、FormはあってもWPFがないとか、ということもあります。

    だいたい、検索して足りている場合には質問しないので、検索しないで質問しているように思えるかもしれませんが、そういうわけでもありません。いちいち質問するときに、キーワードを思いつかないなどと書くのも、なんというかおとなげない気もして、そっけない書き方をしているかもしれませんね…。

    だから、一見するとなんでもかんでも訊いているように思えるのかもしれませんが、ぜんぜんそんなことはないです。できることは自分でやっていて、それでもどうにもならないことを伺っているつもりです。
    そう見えないとしたら、それよりもずっと多くのコードを書いているのだとお考えいただけるとうれしく。じっさい、1日に平均して30行、多いときには100~200行くらいは書いていますし。

    2011年4月28日 12:01
  • そんなに難しくないですよ。
    textBox.Paste("文字列");
    を使えばキャレット位置に文字列挿入されると思います。
    2017年10月27日 0:09