ফর্ম প্রদর্শিত হবে কেন টেক্সটবক্সে পাঠ্য হাইলাইট করা হয় (নির্বাচিত)?


86

আমার TextBoxসি-তে একটি ফর্ম রয়েছে যা আমি একটি স্ট্রিংকে নিম্নরূপ সেট করেছি:

textBox.Text = str;

ফর্মটি প্রদর্শিত হয়, কেন টেক্সবক্সে পাঠ্যটি হাইলাইট / নির্বাচিত প্রদর্শিত হবে?


আপনার প্রশ্নের সাথে সম্পর্কিত করা যেতে পারে stackoverflow.com/questions/1140250/...
DarenW

আপনি কি এইটিকে বাছাই করে পরিচালনা করেছেন? আপনি কিভাবে এটি ঠিক করেছেন?
ফ্লেচার

@ ফ্লেচার: আমি এখনও এটি দেখার জন্য গোল করতে পারেনি। আমি উত্তরটি কয়েক দিনের মধ্যে দেব।
সিজে

আপনি একটি vb.net ট্যাগ যুক্ত করতে পারেন, যেহেতু সমস্যাটি একই রকম এবং গ্রহণযোগ্য
উত্তরটিও

ট্যাব অর্ডার দেখার সাথে সম্পর্কিত বেনস্মিথের উত্তর এই পরিস্থিতিতে খুব দরকারী হবে।
চঠুরঙ্গ

উত্তর:


130

পাঠ্য বাক্সটিতে TabIndex0 রয়েছে এবং এটি TabStopসত্যতে সেট করা আছে। এর অর্থ হল যে ফর্মটি প্রদর্শিত হবে তখন নিয়ন্ত্রণটি ফোকাস দেওয়া হবে।

আপনি হয় অন্যটি নিয়ন্ত্রণে 0 দিতে TabIndexপারেন (যদি থাকে তবে) এবং পাঠ্য বাক্সটিকে একটি আলাদা ট্যাব সূচক (> 0) দিতে পারেন, বা TabStopএটি হওয়া থেকে বিরত রাখতে পাঠ্য বাক্সটির জন্য মিথ্যাতে সেট করা যেতে পারে।


4
আপনি কি নিশ্চিত যে পাঠ্যবাক্স ট্যাবআইডেক্স 0 তে সেট করা আছে? এটা তার আচরণ থেকে আসে?
26071986

@ 26071986 - ভাল, আমি একটি দ্রুত পরীক্ষা চালিয়েছি। যদি একটি ফর্মের সাথে একটি পাঠ্য বাক্স এবং একটি বোতাম থাকে, আমি ট্যাবইন্ডেক্স 0 তে সেট করা থাকলে পাঠ্যটি হাইলাইট করা হয় তখন আমি কনস্ট্রাক্টরের পাঠ্যবক্সের মধ্যে পাঠ্য পরিবর্তন করি। যদি বোতামটিতে 0 ট্যাব সূচক থাকে এবং পাঠ্যবক্সের ট্যাবইন্ডেক্সটি 0 হয় তবে পাঠ্যটি হাইলাইট করা হয় না।
ফ্লেচার

এটি ট্যাবআইএনডেক্সের সাথে করা উচিত বলে মনে হচ্ছে - কেবলমাত্র আমি আমার সমস্ত উপাদান ট্যাব সূচকগুলি যথাযথভাবে পরিবর্তন করেছি (তাই আমি ভেবেছিলাম)। সক্রিয় হয় যে গোষ্ঠীগুলির ট্যাব সূচকগুলিও খুব বেশি যা আপনাকে পরিবর্তন করতে হবে তেমনি তাদের সমস্ত উপাদান রয়েছে। সুতরাং আমি 1-9 সাল থেকে উপাদান ট্যাবগুলি সেট আপ করেছি, একটি গোষ্ঠীতে এখনও 0 ছিল, সুতরাং সেই গোষ্ঠীর পাঠ্য বাক্সটি প্রথম সক্রিয় উপাদান হয়ে উঠেছে (সুতরাং এর বিষয়বস্তু হাইলাইট করা হয়েছিল)।
deed02392

4
এটি প্রয়োজনীয়ভাবে TabIndex = 0 থাকার সাথে সম্পর্কিত নয়, তবে পাঠ্যবক্সের ফর্মটির নিম্নতম ট্যাবইন্ডেক্স থাকলে তা অবশ্যই ঘটে। যাচাই করার জন্য: টেক্সটবক্সে ট্যাবইন্ডেক্স = 5 সেট করুন এবং ফর্মের অন্যান্য নিয়ন্ত্রণের সমস্ত ট্যাবইন্ডেক্সে 5 এর চেয়ে বড় সংখ্যক সেট করুন।
Andrea Antonangeli

আপনি যখন ট্যাবকন্ট্রোলটিতে একটি নতুন ট্যাবপেজ নির্বাচন করেন তখন এটিও ঘটে। একই সমাধান কাজ করে।
জোনপি

44

উইন্ডোজ ফর্মগুলির একটি টেক্সটবক্সের ডিফল্ট আচরণ হ'ল এটি প্রথম বারের মধ্যে ট্যাব লাগিয়ে যদি মনোনিবেশ করে তবে সমস্তটি হাইলাইট করা তবে এটিতে ক্লিক করা হয় না। আমরা TextBoxএর OnGotFocus()ওভাররাইড দেখে রিফ্লেক্টরে দেখতে পাচ্ছি :

protected override void OnGotFocus(EventArgs e)
{
    base.OnGotFocus(e);
    if (!this.selectionSet)
    {
        this.selectionSet = true;
        if ((this.SelectionLength == 0) && (Control.MouseButtons == MouseButtons.None))
        {
            base.SelectAll();
        }
    }
}

এটি যদি এমন বিবৃতি হয় যা আমাদের পছন্দ না করে এমন আচরণের কারণ হয়। তদ্ব্যতীত, আঘাতের ক্ষেত্রে অপমান যুক্ত করার জন্য, Textসম্পত্তিটির সেটার selectionSetযখনই পাঠ্যটি পুনরায় বরাদ্দ করা হয় তখন অন্ধভাবে সেই পরিবর্তনশীলটিকে পুনরায় সেট করে :

public override string Text
{
    get
    {
        return base.Text;
    }
    set
    {
        base.Text = value;
        this.selectionSet = false;
    }
}

সুতরাং আপনার যদি এতে একটি পাঠ্যবক্স এবং ট্যাব থাকে তবে সমস্ত পাঠ্য নির্বাচন করা হবে। আপনি যদি এটিতে ক্লিক করেন তবে হাইলাইটটি সরানো হবে এবং আপনি যদি এটিতে আবার ট্যাব করেন তবে আপনার ক্যারেটের অবস্থান (এবং শূন্যের নির্বাচনের দৈর্ঘ্য) সংরক্ষণ করা হবে। তবে আমরা যদি প্রোগ্রামগতভাবে নতুন Text, এবং আবার টেক্সটবক্সে ট্যাব সেট করি তবে সমস্ত পাঠ্যই আবার নির্বাচন করা হবে।

আপনি যদি আমার মতো হন এবং এই আচরণটিকে বিরক্তিকর এবং বেমানান বলে মনে করেন, তবে এই সমস্যাটির চারপাশে দুটি উপায় রয়েছে।

প্রথমটি এবং সম্ভবত সবচেয়ে সহজ, হ'ল ফর্মের সাথে এবং যখনই পরিবর্তনগুলি selectionSetকল DeselectAll()করে সেটিংটি ট্রিগার করা :Load()Text

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    this.textBox2.SelectionStart = this.textBox2.Text.Length;
    this.textBox2.DeselectAll();
}

( DeselectAll()শুধু সেট SelectionLengthশুন্যতে। এটি আসলে SelectionStartফ্লিপ যে TextBoxএর selectionSetপরিবর্তনশীল। উপরে ক্ষেত্রে, থেকে কল DeselectAll()যেহেতু আমরা লেখার শেষে শুরু সেটিং করা হয় প্রয়োজন নেই। কিন্তু আমরা অন্য কোন অবস্থান, এটি সেট যদি মত পাঠ্যের শুরু, তারপরে এটি কল করা ভাল ধারণা))

অধিক স্থায়ী উপায় হ'ল উত্তরাধিকারের মাধ্যমে কাঙ্ক্ষিত আচরণ সহ আমাদের নিজস্ব টেক্সটবক্স তৈরি করা:

public class NonSelectingTextBox : TextBox
{
    // Base class has a selectionSet property, but its private.
    // We need to shadow with our own variable. If true, this means
    // "don't mess with the selection, the user did it."
    private bool selectionSet;

    protected override void OnGotFocus(EventArgs e)
    {
        bool needToDeselect = false;

        // We don't want to avoid calling the base implementation
        // completely. We mirror the logic that we are trying to avoid;
        // if the base implementation will select all of the text, we
        // set a boolean.
        if (!this.selectionSet)
        {
            this.selectionSet = true;

            if ((this.SelectionLength == 0) && 
                (Control.MouseButtons == MouseButtons.None))
            {
                needToDeselect = true;
            }
        }

        // Call the base implementation
        base.OnGotFocus(e);

        // Did we notice that the text was selected automatically? Let's
        // de-select it and put the caret at the end.
        if (needToDeselect)
        {
            this.SelectionStart = this.Text.Length;
            this.DeselectAll();
        }
    }

    public override string Text
    {
        get
        {
            return base.Text;
        }
        set
        {
            base.Text = value;

            // Update our copy of the variable since the
            // base implementation will have flipped its back.
            this.selectionSet = false;
        }
    }
}

আপনি কেবল কল না করার লোভ দেখিয়েছিলেন base.OnGotFocus(), তবে তারপরে আমরা বেস Controlশ্রেণিতে দরকারী কার্যকারিতা হারাব । এবং আপনি selectionSetকোনও অর্থহীনকে এড়িয়ে যাবেন না এবং লোকেদের অনোগট ফোকাসে প্রতিবার কেবল অনির্বাচিত করতে প্ররোচিত হতে পারেন, তবে তারপরে ক্ষেত্র এবং পিছনে ট্যাবড করা থাকলে আমরা ব্যবহারকারীর হাইলাইটটি হারাব।

কুৎসিত? তুই বেচা। তবে এটি যা হয়।


31

এই প্রশ্নের উত্তরগুলি আমাকে অনুরূপ সমস্যার সাথে অনেকটা সহায়তা করেছিল, তবে সহজ উত্তরটি কেবল আরও অনেক জটিল পরামর্শ দিয়ে ইঙ্গিত করা হয়। আপনার পাঠ্য সেট SelectionStartকরার 0পরে কেবল সেট করুন । সমস্যা সমাধান!

উদাহরণ:

yourtextbox.Text = "asdf";
yourtextbox.SelectionStart = 0;

4

আপনি নিজের ফর্মের নিয়ন্ত্রণগুলির জন্য ট্যাব অর্ডারটি খোলার মাধ্যমেও চয়ন করতে পারেন:

দেখুন-> ট্যাব অর্ডার

মনে রাখবেন যে ফর্ম ডিজাইন ভিউটি যদি আপনার কাছে খোলা থাকে তবে এই বিকল্পটি কেবল "দেখুন" তে উপলব্ধ।

"ট্যাব অর্ডার" নির্বাচন করা ফর্মের একটি দৃশ্য খুলবে যা আপনাকে নিয়ন্ত্রণগুলিতে ক্লিক করে পছন্দসই ট্যাব অর্ডার চয়ন করতে দেয়।


4
এটি আমাকে অনেক সাহায্য করেছিল। আসলে আমরা ট্যাব অর্ডার নিয়ে উদ্বেগ প্রকাশ করি তবে ট্যাব সূচী কিছু যায় আসে না।
সামিঠা চঠুরঙ্গ

1

ভিএস ২০১৩ সহ একটি পাঠ্য ক্ষেত্রটি আলোকপাত করতে, এর সাথে আরম্ভের চেষ্টা করুন:

myTextBox.GotFocus += new System.EventHandler(this.myTextBox_GotFocus);

এবং পদ্ধতিটি যুক্ত করুন:

public void myTextBox_GotFocus(object sender, EventArgs e)
{
    myTextBox.SelectionLength=0;
}

আপনি যদি পূর্বে পাঠ্য বাক্সটি ফোকাস করে থাকেন, এতে কিছু পাঠ্য নির্বাচন করেছেন, এটি থেকে সরে এসে আবার এটি মনোনিবেশ করেন তবে এটি পাঠ্যটি অনির্বাচিত হয়ে উঠবে।
স্টুয়ার্ট

0

আমি এটি সি # তে পরীক্ষা করে দেখিনি তবে আমি সি ++ ডব্লিউএন 32 ডায়ালগ বাক্স ব্যবহার করে একই সমস্যায় পড়েছি। দেখে মনে হচ্ছে আপনি বা FALSEথেকে ফিরে আচরণটি পরিবর্তন করতে পারেন । আশাকরি এটা সাহায্য করবে.OnInitDialog()WM_INITDIALOG


4
উইন্ডোজ এপিআই উইনফর্মগুলির অভ্যন্তরে আবদ্ধ হওয়ায় এটি খুব বেশি সহায়ক হবে বলে আমি মনে করি না।
নাথান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.