سوال در مورد آرایه ها

MRHADI

Member
سلام
من کد زیر رو نوشتم که خب مشخصه و میاد در یک متن اعداد و حروف رو از هم جدا میکنه،البته متن من هم فقط اعداد و حروف هستند
متن حتما دارای حروف هست،اما ممکنه عدد نداشته باشه،حالا میخوام چیزی بنویسم که اگ عدد نداشته اون adad برابر عدد 1 بشه
هر چی نوشتم نشد،مثلا اومدم گفتم اگر مقدار adad برابر null شد فلان ولی نشد،ممنون میشم راهنمایی کنید
کد:
                            string TTTT = TFFF.ToString();
                            StringBuilder adad = new StringBuilder();
                            StringBuilder alph = new StringBuilder();
                            foreach (char c in TTTT)
                            {
                                if (char.IsDigit(c))
                                    adad.Append(c);
                                else
                                    alph.Append(c);

                            }
آیا این کد رو ساده تر هم میشه نوشت؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام
من کد زیر رو نوشتم که خب مشخصه و میاد در یک متن اعداد و حروف رو از هم جدا میکنه،البته متن من هم فقط اعداد و حروف هستند
متن حتما دارای حروف هست،اما ممکنه عدد نداشته باشه،حالا میخوام چیزی بنویسم که اگ عدد نداشته اون adad برابر عدد 1 بشه
هر چی نوشتم نشد،مثلا اومدم گفتم اگر مقدار adad برابر null شد فلان ولی نشد،ممنون میشم راهنمایی کنید
کد:
                            string TTTT = TFFF.ToString();
                            StringBuilder adad = new StringBuilder();
                            StringBuilder alph = new StringBuilder();
                            foreach (char c in TTTT)
                            {
                                if (char.IsDigit(c))
                                    adad.Append(c);
                                else
                                    alph.Append(c);

                            }
آیا این کد رو ساده تر هم میشه نوشت؟
کد خطی خیلی ساده و خوبی نوشته اید، لذا پیشنهاد خاصی برای بهینه سازی اش ندارم. طبعا با توجه به اینکه adad و ()adad.ToString هیچوقت null نمیشه، روی null بودنش نمی توانید شرط قرار بدید، ولی طول اش می تونه صفر باشه :
کد:
            string TTTT = TFFF.ToString();
            StringBuilder adad = new StringBuilder();
            StringBuilder alph = new StringBuilder();
            foreach (char c in TTTT)
            {
                if (char.IsDigit(c))
                    adad.Append(c);
                else
                    alph.Append(c);
            }
            if (adad.Length == 0)
                adad.Append('1');
 

MRHADI

Member
ممنون
من میخوام کد بالا رو که نوشتم به صورت زیر بنویسم
کد:
            StringBuilder adad = new StringBuilder();
            StringBuilder alph = new StringBuilder();
            foreach (char c in TimeFrame)
            {
                if (char.IsDigit(c))
                    adad.Append(c);
                else
                    alph.Append(c);
            }
            if (adad.Length == 0)
                adad.Append('1');
اما این خطا رو میده
Error CS1579: foreach statement cannot operate on variables of type 'cAlgo.API.TimeFrame' because 'cAlgo.API.TimeFrame' does not contain a public definition for 'GetEnumerator'
چطور میتونم این خطا رو رفع کنم و به مقصودم هم برسم
اگر لازم هست جزئیات بیشتری ارائه بدم
 

the_king

مدیرکل انجمن
ممنون
من میخوام کد بالا رو که نوشتم به صورت زیر بنویسم
کد:
            StringBuilder adad = new StringBuilder();
            StringBuilder alph = new StringBuilder();
            foreach (char c in TimeFrame)
            {
                if (char.IsDigit(c))
                    adad.Append(c);
                else
                    alph.Append(c);
            }
            if (adad.Length == 0)
                adad.Append('1');
اما این خطا رو میده
Error CS1579: foreach statement cannot operate on variables of type 'cAlgo.API.TimeFrame' because 'cAlgo.API.TimeFrame' does not contain a public definition for 'GetEnumerator'
چطور میتونم این خطا رو رفع کنم و به مقصودم هم برسم
اگر لازم هست جزئیات بیشتری ارائه بدم
کد قبلی تون بر اساس ()TFFF.ToString که یک string ئه و به مجموعه ای از char ها تفسیر میشه بود و به همین خاطر foreach برایش قابل استفاده بود.
TimeFrame اسم یک کلاس یا چیزی شبیه به اون ئه، که ظاهرا کدش رو هم شما ننوشته اید. لذا یک مجموعه نیست که foreach رویش عمل کنه.
مخصوصا که اعضاء مجموعه اش هم باید char باشند که foreach (char c in TimeFrame) معنی داشته باشه.
TimeFrame شما که string یا مجموعه ای از char ها نیست.
 

MRHADI

Member
کد قبلی تون بر اساس ()TFFF.ToString که یک string ئه و به مجموعه ای از char ها تفسیر میشه بود و به همین خاطر foreach برایش قابل استفاده بود.
TimeFrame اسم یک کلاس یا چیزی شبیه به اون ئه، که ظاهرا کدش رو هم شما ننوشته اید. لذا یک مجموعه نیست که foreach رویش عمل کنه.
مخصوصا که اعضاء مجموعه اش هم باید char باشند که foreach (char c in TimeFrame) معنی داشته باشه.
TimeFrame شما که string یا مجموعه ای از char ها نیست.
حق با شماست
TimeFrame رو من ننوشتم و TFFF هم از اینجا میاد:
کد:
            TimeFrame[] TTFF =
            {
                TimeFrame.Monthly,
                TimeFrame.Weekly,
                TimeFrame.Daily,
                TimeFrame.Hour12,
                TimeFrame.Hour8,
                TimeFrame.Hour6,
                TimeFrame.Hour4,
                TimeFrame.Hour3,
                TimeFrame.Hour2,
                TimeFrame.Hour,
                TimeFrame.Minute45,
                TimeFrame.Minute30,
                TimeFrame.Minute20,
                TimeFrame.Minute15,
                TimeFrame.Minute10,
                TimeFrame.Minute5,
                TimeFrame.Minute

            };
            var TTT = _f1.checkedListBox2.Items.Cast<TimeFrame>().ToArray();

foreach (var TFFF in TTT)
                                                                                                          
  {                                                                                                         
   .                                                                                                        
   .                                                                                        
   .
                                                                                                        
  }
حالا با این تفاسیر آیا میشه مستقیم از TimeFrame استفاده کرد و دیگه نیاز نباشه یکی یکی اعضاشو مثل مجموعه TTFF تعریف کنیم؟
 

MRHADI

Member
حق با شماست
TimeFrame رو من ننوشتم و TFFF هم از اینجا میاد:
کد:
            TimeFrame[] TTFF =
            {
                TimeFrame.Monthly,
                TimeFrame.Weekly,
                TimeFrame.Daily,
                TimeFrame.Hour12,
                TimeFrame.Hour8,
                TimeFrame.Hour6,
                TimeFrame.Hour4,
                TimeFrame.Hour3,
                TimeFrame.Hour2,
                TimeFrame.Hour,
                TimeFrame.Minute45,
                TimeFrame.Minute30,
                TimeFrame.Minute20,
                TimeFrame.Minute15,
                TimeFrame.Minute10,
                TimeFrame.Minute5,
                TimeFrame.Minute

            };
            var TTT = _f1.checkedListBox2.Items.Cast<TimeFrame>().ToArray();

foreach (var TFFF in TTT)
                                                                                                        
  {                                                                                                       
   .                                                                                                      
   .                                                                                      
   .
                                                                                                      
  }
حالا با این تفاسیر آیا میشه مستقیم از TimeFrame استفاده کرد و دیگه نیاز نباشه یکی یکی اعضاشو مثل مجموعه TTFF تعریف کنیم؟
آقا اوکی شد
چاره این بود که زدم :
کد:
            var TFM = TimeFrame.ToString();
و بعد :
کد:
 foreach (char c in TFM )
            {
                if (char.IsDigit(c))
                    adad.Append(c);
                else
                    alph.Append(c);
            }
            if (adad.Length == 0)
                adad.Append('1');
 

the_king

مدیرکل انجمن
حق با شماست
TimeFrame رو من ننوشتم و TFFF هم از اینجا میاد:
کد:
            TimeFrame[] TTFF =
            {
                TimeFrame.Monthly,
                TimeFrame.Weekly,
                TimeFrame.Daily,
                TimeFrame.Hour12,
                TimeFrame.Hour8,
                TimeFrame.Hour6,
                TimeFrame.Hour4,
                TimeFrame.Hour3,
                TimeFrame.Hour2,
                TimeFrame.Hour,
                TimeFrame.Minute45,
                TimeFrame.Minute30,
                TimeFrame.Minute20,
                TimeFrame.Minute15,
                TimeFrame.Minute10,
                TimeFrame.Minute5,
                TimeFrame.Minute

            };
            var TTT = _f1.checkedListBox2.Items.Cast<TimeFrame>().ToArray();

foreach (var TFFF in TTT)
                                                                                                         
  {                                                                                                        
   .                                                                                                       
   .                                                                                       
   .
                                                                                                       
  }
حالا با این تفاسیر آیا میشه مستقیم از TimeFrame استفاده کرد و دیگه نیاز نباشه یکی یکی اعضاشو مثل مجموعه TTFF تعریف کنیم؟
مستقیما که نه، اصلا نمیشه، به دو دلیل، دلیل اول اینکه TimeFrame یک کلاس ئه، نه یک شی از کلاس TimeFrame.
مثل اینه که بنویسید foreach (var c in string) که اشتباه ئه. بجای اون string باید یک شیء از کلاس string قرار داده بشه. شما هم نمی توانید بجای TTT خود TimeFrame رو در foreach قرار بدهید.
دلیل دوم اینه که TimeFrame برای پشتیبانی از foreach باید Enumerable باشه که لازمه اش اینه که کسی که TimeFrame رو طراحی کرده تغییراتی در کدش بده.

البته ممکنه کد هایی مثل این کار کنه، اما ترتیب قرار گیری اعضاء در مجموعه ممکنه دلخواه تون نباشه :
اگر TimeFrame یک enum ئه و TimeFrame.Monthly یکی از فیلد هاش :
کد:
            var TTT = (TimeFrame[]) Enum.GetValues( typeof(TimeFrame));
            foreach (var TFFF in TTT)
            {

            }
اگر TimeFrame یک کلاس ئه و TimeFrame.Monthly یک فیلد static از نوع TimeFrame ئه :
کد:
            var allFields = typeof(TimeFrame).GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);
            var TTT = (from a in allFields where a.FieldType == typeof(TimeFrame) select a.GetValue(null)).Cast<TimeFrame>();
            foreach (var TFFF in TTT)
            {

            }
اگر TimeFrame یک کلاس ئه و TimeFrame.Monthly یک پروپرتی static از نوع TimeFrame ئه :
کد:
            var allFields = typeof(TimeFrame).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);
            var TTT = (from a in allFields where a.PropertyType == typeof(TimeFrame) select a.GetValue(null, null)).Cast<TimeFrame>();
            foreach (var TFFF in TTT)
            {

            }
 

the_king

مدیرکل انجمن
آقا اوکی شد
چاره این بود که زدم :
کد:
            var TFM = TimeFrame.ToString();
و بعد :
کد:
 foreach (char c in TFM )
            {
                if (char.IsDigit(c))
                    adad.Append(c);
                else
                    alph.Append(c);
            }
            if (adad.Length == 0)
                adad.Append('1');
TimeFrame رو که string کردید همیشه یک مقدار ثابت بدست نمیاد؟ شباهتی به کارکرد کد قبلی تون نداره.
 

MRHADI

Member
مستقیما که نه، اصلا نمیشه، به دو دلیل، دلیل اول اینکه TimeFrame یک کلاس ئه، نه یک شی از کلاس TimeFrame.
مثل اینه که بنویسید foreach (var c in string) که اشتباه ئه. بجای اون string باید یک شیء از کلاس string قرار داده بشه. شما هم نمی توانید بجای TTT خود TimeFrame رو در foreach قرار بدهید.
دلیل دوم اینه که TimeFrame برای پشتیبانی از foreach باید Enumerable باشه که لازمه اش اینه که کسی که TimeFrame رو طراحی کرده تغییراتی در کدش بده.

البته ممکنه کد هایی مثل این کار کنه، اما ترتیب قرار گیری اعضاء در مجموعه ممکنه دلخواه تون نباشه :
ماشاءالله به این تبحرتون ، ای ولله
این چیزی که عرض کردم نوشتم داره جواب میده ولی واقعا استفاده کردم و میکنم از کدهایی که زحمت کشیدید
این عکس تعریفی هست که ویژوال استودیو از TimeFrame داره:
 

پیوست ها

  • sshot-2.jpg
    sshot-2.jpg
    20.5 کیلوبایت · بازدیدها: 2

MRHADI

Member
سلام
من یک کد نوشتم که ساده شدش میشه کد زیر و فکر میکنم کارکردش مشخصه
فقط چیزی که هست میخوام کلیدهای ساخته شده به ازای هر کدام از آرایه های ST در یک سطر جداگانه قرار بگیرن،یعنی وقتی اومد A رو گرفت و کلیدهای AA1,AB1,AC1,AD1 ساخته شد موقعی که B شروع شد
بره سطر جدید
یعنی به ازای هر آرایه از ST برای Location کلیدها y ثابت و x ها مثلا چندتاچندتا تغیر کنن و برای آرایه بعدی ST بگیم y به اندازه یک سطر تغییر کنه
ان شاءالله تونستم باشم برسونم منظورم رو
کد:
string[] ST= new string[] {"A", "B", "C","D"};

string[] ST1= new string[] {"A1", "B1", "C1","D1"};



foreach (var S in ST)
     
    {
foreach (var S1 in ST1)
                        {

                                var BTN1 = new System.Windows.Forms.Button();
                                BTN1.Text = S1;
                                BTN1.ForeColor = CL;
                                BTN1.AutoSize = true;
                                BTN1.AutoSizeMode = AutoSizeMode.GrowAndShrink;
                                BTN1.FlatStyle = FlatStyle.Flat;

          }
}
 

the_king

مدیرکل انجمن
سلام
من یک کد نوشتم که ساده شدش میشه کد زیر و فکر میکنم کارکردش مشخصه
فقط چیزی که هست میخوام کلیدهای ساخته شده به ازای هر کدام از آرایه های ST در یک سطر جداگانه قرار بگیرن،یعنی وقتی اومد A رو گرفت و کلیدهای AA1,AB1,AC1,AD1 ساخته شد موقعی که B شروع شد
بره سطر جدید
یعنی به ازای هر آرایه از ST برای Location کلیدها y ثابت و x ها مثلا چندتاچندتا تغیر کنن و برای آرایه بعدی ST بگیم y به اندازه یک سطر تغییر کنه
ان شاءالله تونستم باشم برسونم منظورم رو
کد:
string[] ST= new string[] {"A", "B", "C","D"};

string[] ST1= new string[] {"A1", "B1", "C1","D1"};



foreach (var S in ST)
    
    {
foreach (var S1 in ST1)
                        {

                                var BTN1 = new System.Windows.Forms.Button();
                                BTN1.Text = S1;
                                BTN1.ForeColor = CL;
                                BTN1.AutoSize = true;
                                BTN1.AutoSizeMode = AutoSizeMode.GrowAndShrink;
                                BTN1.FlatStyle = FlatStyle.Flat;

          }
}
کد:
            var ST = new string[] { "A", "B", "C", "D" };
            var ST1 = new string[] { "A1", "B1", "C1", "D1" };
            flowLayoutPanel1.FlowDirection = FlowDirection.TopDown;
            foreach (var S in ST)
            {
                var f = new FlowLayoutPanel();
                f.Width = flowLayoutPanel1.Width;
                f.Margin = new Padding(1);
                flowLayoutPanel1.Controls.Add(f);
                foreach (var S1 in ST1)
                {
                    var BTN1 = new System.Windows.Forms.Button();
                    BTN1.Text = S + S1;
                    BTN1.ForeColor = CL;
                    BTN1.AutoSize = true;
                    BTN1.AutoSizeMode = AutoSizeMode.GrowAndShrink;
                    BTN1.FlatStyle = FlatStyle.Flat;
                    f.Height = BTN1.Height + BTN1.Margin.Vertical;
                    f.Controls.Add(BTN1);
                }
            }
 

p30sis

New Member
ممنون
من میخوام کد بالا رو که نوشتم به صورت زیر بنویسم
کد:
            StringBuilder adad = new StringBuilder();
            StringBuilder alph = new StringBuilder();
            foreach (char c in TimeFrame)
            {
                if (char.IsDigit(c))
                    adad.Append(c);
                else
                    alph.Append(c);
            }
            if (adad.Length == 0)
                adad.Append('1');
اما این خطا رو میده
Error CS1579: foreach statement cannot operate on variables of type 'cAlgo.API.TimeFrame' because 'cAlgo.API.TimeFrame' does not contain a public definition for 'GetEnumerator'
چطور میتونم این خطا رو رفع کنم و به مقصودم هم برسم
اگر لازم هست جزئیات بیشتری ارائه بدم
منم دقیقا همین مشکل رو دارم
مراحلی که گفتین هم انجام دادم ولی بازم فرقی نکرد :(
 

MRHADI

Member
کد:
            var ST = new string[] { "A", "B", "C", "D" };
            var ST1 = new string[] { "A1", "B1", "C1", "D1" };
            flowLayoutPanel1.FlowDirection = FlowDirection.TopDown;
            foreach (var S in ST)
            {
                var f = new FlowLayoutPanel();
                f.Width = flowLayoutPanel1.Width;
                f.Margin = new Padding(1);
                flowLayoutPanel1.Controls.Add(f);
                foreach (var S1 in ST1)
                {
                    var BTN1 = new System.Windows.Forms.Button();
                    BTN1.Text = S + S1;
                    BTN1.ForeColor = CL;
                    BTN1.AutoSize = true;
                    BTN1.AutoSizeMode = AutoSizeMode.GrowAndShrink;
                    BTN1.FlatStyle = FlatStyle.Flat;
                    f.Height = BTN1.Height + BTN1.Margin.Vertical;
                    f.Controls.Add(BTN1);
                }
            }
سلام و سپاس
مثل همیشه عالی
سه تا مسئله دارم
یکی اینکه به نظر میاد مقداری از فضای بالای flowLayoutPanel1 رو استفاده نمیکنه
دوم اینکه اگر تعداد کلیدها زیاد بود(تعداد اعضای ST و ST1 زیاد بود)چطوری بقیه رو نشون بده؟
سوم اینکه اگر نخوام متن هر کلیدی S رو داشته باشه و فقط همون اول سطر S رو به صورت لیبل یا هرچیز دیگه ای داشته باشم باید چطوری عمل کنم؟
 

the_king

مدیرکل انجمن
سلام و سپاس
مثل همیشه عالی
سه تا مسئله دارم
یکی اینکه به نظر میاد مقداری از فضای بالای flowLayoutPanel1 رو استفاده نمیکنه
فاصله ها رو با Padding و Margin کنترل کنید، Padding فاصله اجزاء داخل کنترل از لبه ها است و Margin فاصله بین کنترل و سایر کنترل های بیرونی. مثلا f.Padding میگه دکمه های داخل f چقدر از لبه های f فاصله داشته باشند و f.Margin میگه f از flowLayoutPanel1 و سایر FlowLayoutPanel های داخل flowLayoutPanel1 چقدر فاصله داشته باشه.
Padding و Margin رو به دو صورت new Padding(1) = و new Padding(1, 1, 1, 1) = می توانید مقدار دهی کنید که در اولی همه مقادیر یکسان میشه و در دومی می توانید مقادیر متفاوتی برای هر لبه در نظر بگیرید.
دوم اینکه اگر تعداد کلیدها زیاد بود(تعداد اعضای ST و ST1 زیاد بود)چطوری بقیه رو نشون بده؟
خیلی ساده، برای flowLayoutPanel1 مقدار مشخصه AutoScroll رو true کنید تا بتونه ScrollBar نشون بده و برای f هم AutoSize رو true کنید تا به حد لازم دراز بشن، دیگه لازم نیست که برای f مقدار Width مشخص کنید :
کد:
            var ST = new string[] { "A", "B", "C", "D" };
            var ST1 = new string[] { "A1", "B1", "C1", "D1" };
            flowLayoutPanel1.FlowDirection = FlowDirection.TopDown;
            flowLayoutPanel1.AutoScroll = true;
            foreach (var S in ST)
            {
                var f = new FlowLayoutPanel();
                f.AutoSize = true;
                f.Margin = new Padding(1, 1, 1, 1);
سوم اینکه اگر نخوام متن هر کلیدی S رو داشته باشه و فقط همون اول سطر S رو به صورت لیبل یا هرچیز دیگه ای داشته باشم باید چطوری عمل کنم؟
دقیقا همون کاری که گفتید بکنید، S رو از BTN1.Text حذف کنید و در عوض ابتدای ساختن f یک Label ای با اون Text ئه S به f اضافه کنید :
کد:
            var ST = new string[] { "A", "B", "C", "D" };
            var ST1 = new string[] { "A1", "B1", "C1", "D1" };
            flowLayoutPanel1.FlowDirection = FlowDirection.TopDown;
            flowLayoutPanel1.AutoScroll = true;
            foreach (var S in ST)
            {
                var f = new FlowLayoutPanel();
                f.AutoSize = true;
                f.Margin = new Padding(1, 1, 1, 1);
                flowLayoutPanel1.Controls.Add(f);
                var lbl = new Label();
                lbl.Text = S;
                lbl.TextAlign = ContentAlignment.MiddleCenter;
                f.Controls.Add(lbl);
                foreach (var S1 in ST1)
                {
                    var BTN1 = new System.Windows.Forms.Button();
                    BTN1.Text = S1;
                    BTN1.ForeColor = CL;
                    BTN1.AutoSize = true;
                    BTN1.AutoSizeMode = AutoSizeMode.GrowAndShrink;
                    BTN1.FlatStyle = FlatStyle.Flat;
                    lbl.Margin = BTN1.Margin;
                    lbl.Size = new Size(30, BTN1.Height);
                    f.Height = BTN1.Height + BTN1.Margin.Vertical;
                    f.Controls.Add(BTN1);
                }
            }
 

MRHADI

Member
فاصله ها رو با Padding و Margin کنترل کنید، Padding فاصله اجزاء داخل کنترل از لبه ها است و Margin فاصله بین کنترل و سایر کنترل های بیرونی. مثلا f.Padding میگه دکمه های داخل f چقدر از لبه های f فاصله داشته باشند و f.Margin میگه f از flowLayoutPanel1 و سایر FlowLayoutPanel های داخل flowLayoutPanel1 چقدر فاصله داشته باشه.
Padding و Margin رو به دو صورت new Padding(1) = و new Padding(1, 1, 1, 1) = می توانید مقدار دهی کنید که در اولی همه مقادیر یکسان میشه و در دومی می توانید مقادیر متفاوتی برای هر لبه در نظر بگیرید.

خیلی ساده، برای flowLayoutPanel1 مقدار مشخصه AutoScroll رو true کنید تا بتونه ScrollBar نشون بده و برای f هم AutoSize رو true کنید تا به حد لازم دراز بشن، دیگه لازم نیست که برای f مقدار Width مشخص کنید :
کد:
            var ST = new string[] { "A", "B", "C", "D" };
            var ST1 = new string[] { "A1", "B1", "C1", "D1" };
            flowLayoutPanel1.FlowDirection = FlowDirection.TopDown;
            flowLayoutPanel1.AutoScroll = true;
            foreach (var S in ST)
            {
                var f = new FlowLayoutPanel();
                f.AutoSize = true;
                f.Margin = new Padding(1, 1, 1, 1);

دقیقا همون کاری که گفتید بکنید، S رو از BTN1.Text حذف کنید و در عوض ابتدای ساختن f یک Label ای با اون Text ئه S به f اضافه کنید :
کد:
            var ST = new string[] { "A", "B", "C", "D" };
            var ST1 = new string[] { "A1", "B1", "C1", "D1" };
            flowLayoutPanel1.FlowDirection = FlowDirection.TopDown;
            flowLayoutPanel1.AutoScroll = true;
            foreach (var S in ST)
            {
                var f = new FlowLayoutPanel();
                f.AutoSize = true;
                f.Margin = new Padding(1, 1, 1, 1);
                flowLayoutPanel1.Controls.Add(f);
                var lbl = new Label();
                lbl.Text = S;
                lbl.TextAlign = ContentAlignment.MiddleCenter;
                f.Controls.Add(lbl);
                foreach (var S1 in ST1)
                {
                    var BTN1 = new System.Windows.Forms.Button();
                    BTN1.Text = S1;
                    BTN1.ForeColor = CL;
                    BTN1.AutoSize = true;
                    BTN1.AutoSizeMode = AutoSizeMode.GrowAndShrink;
                    BTN1.FlatStyle = FlatStyle.Flat;
                    lbl.Margin = BTN1.Margin;
                    lbl.Size = new Size(30, BTN1.Height);
                    f.Height = BTN1.Height + BTN1.Margin.Vertical;
                    f.Controls.Add(BTN1);
                }
            }
سلام
طبق کد شما اینطوری میشه که عکس گذاشتم
البته من یه مارجین برای BTN1 مشخص کردم که کلیدها بهم بچسبن ولی بقیش عینا کپی شد و هر چی هم که Padding و Margin کنترل ها و پنل ها رو دستکاری کردم نتونستم درستش کنم
لیبل هایی که براشون کلید ساخته نشده درستن فقط میخوام بچسبن به سمت چپ فرم و اونایی هم که کلید براشون ساخته شده مشخصه
کلا میخوام لیبل ها بچسبن به سمت چپ فرم
ممنون از محبتتون
 

پیوست ها

  • sshot-5.jpg
    sshot-5.jpg
    124.3 کیلوبایت · بازدیدها: 4
آخرین ویرایش:

MRHADI

Member
سلام
طبق کد شما اینطوری میشه که عکس گذاشتم
البته من یه مارجین برای BTN1 مشخص کردم که کلیدها بهم بچسبن ولی بقیش عینا کپی شد و هر چی هم که Padding و Margin کنترل ها و پنل ها رو دستکاری کردم نتونستم درستش کنم
لیبل هایی که براشون کلید ساخته نشده درستن فقط میخوام بچسبن به سمت چپ فرم و اونایی هم که کلید براشون ساخته شده مشخصه
کلا میخوام لیبل ها بچسبن به سمت چپ فرم
ممنون از محبتتون
سلام و درود
بالاخره با تنظیمات زیر درست شد اما دلیلش رو نفهمیدم
کد:
var ST = new string[] { "A", "B", "C", "D" };
            var ST1 = new string[] { "A1", "B1", "C1", "D1" };
            flowLayoutPanel1.FlowDirection = FlowDirection.TopDown;
            flowLayoutPanel1.AutoScroll = true;
            foreach (var S in ST)
            {
                var f = new FlowLayoutPanel();
                        f.AutoSize = true;
                        f.Margin = new Padding(1, 1, 1, 1);
                        _f1.flowLayoutPanel1.Controls.Add(f);
                        var lbl = new Label();
                        lbl.Text = S;
                        lbl.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
                        f.Controls.Add(lbl);
                        lbl.BorderStyle = BorderStyle.FixedSingle;
                        lbl.Size = new System.Drawing.Size(70, 22);
                        lbl.Margin = new Padding(0, 3, 5, 2);
                foreach (var S1 in ST1)
                {
                    var BTN1 = new System.Windows.Forms.Button();
                    BTN1.Text = S1;
                    BTN1.ForeColor = CL;
                    BTN1.AutoSize = true;
                    BTN1.AutoSizeMode = AutoSizeMode.GrowAndShrink;
                    BTN1.FlatStyle = FlatStyle.Flat;
                    BTN1.Margin = new Padding(0, 3, 0, 0);


                              
                               
                                f.Height = BTN1.Height + BTN1.Margin.Vertical;
                                f.Controls.Add(BTN1);
                }
            }
 

the_king

مدیرکل انجمن
سلام
طبق کد شما اینطوری میشه که عکس گذاشتم
البته من یه مارجین برای BTN1 مشخص کردم که کلیدها بهم بچسبن ولی بقیش عینا کپی شد و هر چی هم که Padding و Margin کنترل ها و پنل ها رو دستکاری کردم نتونستم درستش کنم
لیبل هایی که براشون کلید ساخته نشده درستن فقط میخوام بچسبن به سمت چپ فرم و اونایی هم که کلید براشون ساخته شده مشخصه
کلا میخوام لیبل ها بچسبن به سمت چپ فرم
ممنون از محبتتون
برای Label ها یک Size ای مشخص کنید که متن داخلش جا بشه. الان اندازه Label با متن داخلش جور در نمیاد، کوچیک ئه.
کد:
            var ST = new string[] { "XAUUSD", "USDCHF", "EURUSD", "USDJP" };
            var ST1 = new string[] { "H55", "G88", "C44", "U33" };
            flowLayoutPanel1.FlowDirection = FlowDirection.TopDown;
            flowLayoutPanel1.AutoScroll = true;
            foreach (var S in ST)
            {
                var f = new FlowLayoutPanel();
                f.AutoSize = true;
                f.Height = 22;
                f.Margin = new Padding(0, 0, 0, 12);
                flowLayoutPanel1.Controls.Add(f);
                var lbl = new Label();
                lbl.Text = S;
                lbl.TextAlign = ContentAlignment.MiddleLeft;
                lbl.Size = new Size(60, 22);
                lbl.Margin = Padding.Empty;
                f.Controls.Add(lbl);
                foreach (var S1 in ST1)
                {
                    var BTN1 = new System.Windows.Forms.Button();
                    BTN1.Text = S1;
                    BTN1.ForeColor = CL;
                    BTN1.Size = new Size(40, lbl.Height);
                    BTN1.FlatStyle = FlatStyle.Flat;
                    BTN1.Margin = Padding.Empty;
                    BTN1.TextAlign = ContentAlignment.TopCenter;
                    f.Controls.Add(BTN1);
                }
            }
 

MRHADI

Member
سلام
در رخداد کلیلک BTN1 باید چی بنویسم تا با هر بار کلیک روی BTN1 اون مقدار SE برابر شه با یکی از اعضای ST
فکر کنم اون string SE=null; رو اشتباه نوشتم
میخوام به محض شروع مقدار SE برابر باشه با یکی از اعضای ST و بعد هر بار کلیلک SE برابر بشه با عضو بعدی ST
کد:
string SE=null;

                               string[] ST= new string[] {"A", "B", "C","D","E","F","G","H"};


                                var BTN1 = new System.Windows.Forms.Button();
                                BTN1.Text = "NEXT";


                                BTN1.Click += (x, y) => { ??? };

                                SE=......;
البته من اینکارو با استفاده از دستور switch انجام دادم اما هم شکیل و کوتاه نیست و هم اگر تعداد آرایه ها زیاد باشه دردسر میشه و هم با اضافه شدن آرایه به ST باید مدام کد اضافه کرد
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا