আমার TextBox
সি-তে একটি ফর্ম রয়েছে যা আমি একটি স্ট্রিংকে নিম্নরূপ সেট করেছি:
textBox.Text = str;
ফর্মটি প্রদর্শিত হয়, কেন টেক্সবক্সে পাঠ্যটি হাইলাইট / নির্বাচিত প্রদর্শিত হবে?
আমার TextBox
সি-তে একটি ফর্ম রয়েছে যা আমি একটি স্ট্রিংকে নিম্নরূপ সেট করেছি:
textBox.Text = str;
ফর্মটি প্রদর্শিত হয়, কেন টেক্সবক্সে পাঠ্যটি হাইলাইট / নির্বাচিত প্রদর্শিত হবে?
উত্তর:
পাঠ্য বাক্সটিতে TabIndex
0 রয়েছে এবং এটি TabStop
সত্যতে সেট করা আছে। এর অর্থ হল যে ফর্মটি প্রদর্শিত হবে তখন নিয়ন্ত্রণটি ফোকাস দেওয়া হবে।
আপনি হয় অন্যটি নিয়ন্ত্রণে 0 দিতে TabIndex
পারেন (যদি থাকে তবে) এবং পাঠ্য বাক্সটিকে একটি আলাদা ট্যাব সূচক (> 0) দিতে পারেন, বা TabStop
এটি হওয়া থেকে বিরত রাখতে পাঠ্য বাক্সটির জন্য মিথ্যাতে সেট করা যেতে পারে।
উইন্ডোজ ফর্মগুলির একটি টেক্সটবক্সের ডিফল্ট আচরণ হ'ল এটি প্রথম বারের মধ্যে ট্যাব লাগিয়ে যদি মনোনিবেশ করে তবে সমস্তটি হাইলাইট করা তবে এটিতে ক্লিক করা হয় না। আমরা 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
কোনও অর্থহীনকে এড়িয়ে যাবেন না এবং লোকেদের অনোগট ফোকাসে প্রতিবার কেবল অনির্বাচিত করতে প্ররোচিত হতে পারেন, তবে তারপরে ক্ষেত্র এবং পিছনে ট্যাবড করা থাকলে আমরা ব্যবহারকারীর হাইলাইটটি হারাব।
কুৎসিত? তুই বেচা। তবে এটি যা হয়।
এই প্রশ্নের উত্তরগুলি আমাকে অনুরূপ সমস্যার সাথে অনেকটা সহায়তা করেছিল, তবে সহজ উত্তরটি কেবল আরও অনেক জটিল পরামর্শ দিয়ে ইঙ্গিত করা হয়। আপনার পাঠ্য সেট SelectionStart
করার 0
পরে কেবল সেট করুন । সমস্যা সমাধান!
উদাহরণ:
yourtextbox.Text = "asdf";
yourtextbox.SelectionStart = 0;
আপনি নিজের ফর্মের নিয়ন্ত্রণগুলির জন্য ট্যাব অর্ডারটি খোলার মাধ্যমেও চয়ন করতে পারেন:
দেখুন-> ট্যাব অর্ডার
মনে রাখবেন যে ফর্ম ডিজাইন ভিউটি যদি আপনার কাছে খোলা থাকে তবে এই বিকল্পটি কেবল "দেখুন" তে উপলব্ধ।
"ট্যাব অর্ডার" নির্বাচন করা ফর্মের একটি দৃশ্য খুলবে যা আপনাকে নিয়ন্ত্রণগুলিতে ক্লিক করে পছন্দসই ট্যাব অর্ডার চয়ন করতে দেয়।
ভিএস ২০১৩ সহ একটি পাঠ্য ক্ষেত্রটি আলোকপাত করতে, এর সাথে আরম্ভের চেষ্টা করুন:
myTextBox.GotFocus += new System.EventHandler(this.myTextBox_GotFocus);
এবং পদ্ধতিটি যুক্ত করুন:
public void myTextBox_GotFocus(object sender, EventArgs e)
{
myTextBox.SelectionLength=0;
}
আমি এটি সি # তে পরীক্ষা করে দেখিনি তবে আমি সি ++ ডব্লিউএন 32 ডায়ালগ বাক্স ব্যবহার করে একই সমস্যায় পড়েছি। দেখে মনে হচ্ছে আপনি বা FALSE
থেকে ফিরে আচরণটি পরিবর্তন করতে পারেন । আশাকরি এটা সাহায্য করবে.OnInitDialog()
WM_INITDIALOG