تکرار یک قسمت از کد

64hadi64

New Member
سلام دوستان
کدی رو که در ادامه ارسال میکنم نوشتم و میخوام دستورات داخل Timer.Tick + هر مثلا یک ثانیه آپدیت بشن
کد کار میکنه (شاید از لحاظ فنی کدی رو که اینجا فرستادم مشکل تایپی داشته باشه اما کار میده) فقط مشکلم این هست که هر ثانیه یکبار که تایمر فراخوانی میشه کلیدهای تکراری در flowLayoutPanel1 ساخته میشه من فقط میخوام اطلاعات و شرایط مربوط به کلیدها آپدیت بشن و در نتیجه اگر تغییری در کلیدها بعد از آپدیت شرایط به وجود اومده ،کلیدها هم تغییر کنن
از طرفی به دلایلی نمیتونم از دستور flowLayoutPanel1.Controls.Clear() استفاده کنم و باید بدون اون این کار انجام بشه
لطفا راهنمایی بفرمایید
کد:
 stackPanel = new flowLayoutPanel1
            {

                VerticalAlignment = VerticalAlignment.Top,
                HorizontalAlignment = HorizontalAlignment.Right,
                Margin = 0,
                Orientation = Orientation.Vertical


            };

Timer.Start(1);
Timer.Tick += (T, M) =>
{

            foreach (var arn in prices)
            {





                ....................................
...................................................
......................................................
........................................................


                if (......................................................................)
                {

                    SCU = true;
                    CL = Color.Blue;

                }

                else if (...............................................................)
                {
                    SCU = true;
                    CL = Color.Red;

                }
                else
                {
                    SCU = false;
                    CL = Color.Empty;
                }


                if (SCU)

                {

                    var button = new Button
                    {
                        Text = arn,
                        Margin = 0,
                        FontSize = 11,
                        ForegroundColor = CL,
                        FontWeight = FontWeight.UltraBold,
                        IsEnabled = arn != SymbolName,
                        BackgroundColor = Color.Empty

                    };




                    button.Click += Button_Click;



                    if (button.IsEnabled == false)
                    {
                        button.BackgroundColor = Color.LightBlue;
                    }
                    flowLayoutPanel1.Controls.Add(button);
                    

                }


            }

            };
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
اگه منظورتون از ایجاد کلید های جدید ، همون دکمه های جدید هستند ، خوب کدتون رو این طور نوشتید دیگه .
وقتی نوشتید :
var button = new Button
یعنی دکمه های جدیدی هر بار میسازه .
اگه فقط اطلاعاتِ دکمه ها را میخواین تغییر بدین (که نمیدونم کدوم اطلاعات منظورتونه) ، پروپرتی های دکمه ی مورد نظرتون را تغییر بدید (نه اینکه دکمه ی جدیدی بسازید) .
 

the_king

مدیرکل انجمن
سلام دوستان
کدی رو که در ادامه ارسال میکنم نوشتم و میخوام دستورات داخل Timer.Tick + هر مثلا یک ثانیه آپدیت بشن
کد کار میکنه (شاید از لحاظ فنی کدی رو که اینجا فرستادم مشکل تایپی داشته باشه اما کار میده) فقط مشکلم این هست که هر ثانیه یکبار که تایمر فراخوانی میشه کلیدهای تکراری در flowLayoutPanel1 ساخته میشه من فقط میخوام اطلاعات و شرایط مربوط به کلیدها آپدیت بشن و در نتیجه اگر تغییری در کلیدها بعد از آپدیت شرایط به وجود اومده ،کلیدها هم تغییر کنن
از طرفی به دلایلی نمیتونم از دستور flowLayoutPanel1.Controls.Clear() استفاده کنم و باید بدون اون این کار انجام بشه
لطفا راهنمایی بفرمایید

C#:
                    if (SCU)
                    {
                        var name = "buttonprice" + arn.ToString();
                        var button = (Button)flowLayoutPanel1.Controls[name];
                        if (button == null)
                        {
                            button = new Button() { Name = name };
                            button.Click += Button_Click;
                            flowLayoutPanel1.Controls.Add(button);
                        }
                        button.Text = arn;
                        button.Margin = 0;
                        button.FontSize = 11;
                        button.ForegroundColor = CL;
                        button.FontWeight = FontWeight.UltraBold;
                        button.IsEnabled = arn != SymbolName;
                        button.BackgroundColor = Color.Empty;
                        if (button.IsEnabled == false)
                        {
                            button.BackgroundColor = Color.LightBlue;
                        }
                    }
 

64hadi64

New Member
سلام
اگه منظورتون از ایجاد کلید های جدید ، همون دکمه های جدید هستند ، خوب کدتون رو این طور نوشتید دیگه .
وقتی نوشتید :
var button = new Button
یعنی دکمه های جدیدی هر بار میسازه .
اگه فقط اطلاعاتِ دکمه ها را میخواین تغییر بدین (که نمیدونم کدوم اطلاعات منظورتونه) ، پروپرتی های دکمه ی مورد نظرتون را تغییر بدید (نه اینکه دکمه ی جدیدی بسازید) .
متشکرم ولی فکر میکنم نتونستم منظورم رو برسون
باید روی کد جناب
the_king کار کنم ببینم میتونم انجامش بدم
کدها در محیط دیگه ای اجرا میشن و به همین دلیل محدودیت دارم
 

64hadi64

New Member
C#:
                    if (SCU)
                    {
                        var name = "buttonprice" + arn.ToString();
                        var button = (Button)flowLayoutPanel1.Controls[name];
                        if (button == null)
                        {
                            button = new Button() { Name = name };
                            button.Click += Button_Click;
                            flowLayoutPanel1.Controls.Add(button);
                        }
                        button.Text = arn;
                        button.Margin = 0;
                        button.FontSize = 11;
                        button.ForegroundColor = CL;
                        button.FontWeight = FontWeight.UltraBold;
                        button.IsEnabled = arn != SymbolName;
                        button.BackgroundColor = Color.Empty;
                        if (button.IsEnabled == false)
                        {
                            button.BackgroundColor = Color.LightBlue;
                        }
                    }
ممنون
در محیطی که کار میکنم متاسفانه button ها خاصیت Name ندارن
از طرفی flowLayoutPanel1 ها هم خاصیت Controls و Add ندارن و به جای اینها باید flowLayoutPanel1.AddChild(button); اینطوری نوشته بشه
سعی کردم از کدتون استفاده کنم و کمی هم تغییرات دادم اما متاسفانه نشد
ممنون میشم راهنمایی بفرمایید
 

the_king

مدیرکل انجمن
ممنون
در محیطی که کار میکنم متاسفانه button ها خاصیت Name ندارن
از طرفی flowLayoutPanel1 ها هم خاصیت Controls و Add ندارن و به جای اینها باید flowLayoutPanel1.AddChild(button); اینطوری نوشته بشه
سعی کردم از کدتون استفاده کنم و کمی هم تغییرات دادم اما متاسفانه نشد
ممنون میشم راهنمایی بفرمایید
اینکه در چه محیطی برنامه می نویسید رو فقط شما می دونید، از اینکه در اون محیط کنترل ها چه مشخصه هایی دارند بی اطلاع هستم.
 

64hadi64

New Member
var button = (Button)flowLayoutPanel1.Controls[name];
ممنون بله درست میفرمایید و به همین خاطر سوال مطرح کردم وگرنه با flowLayoutPanel1.Controls.Clear کار حل میشد
آیا به جای دستور
var button = (Button)flowLayoutPanel1.Controls[name];
از فرم دیگه ای نمیشه استفاده کرد؟چون این فرم رو قبول نمیکنه و به جای خاصیت Name مثلا بیام از Text استفاده کنم؟
flowLayoutPanel1 هم فقط AddChild رو داره برای button ها و البته Removechild وبقیش خاصیت هایی مثل ارتفاع و عرض و رنگ و ... هست
 

the_king

مدیرکل انجمن
ممنون بله درست میفرمایید و به همین خاطر سوال مطرح کردم وگرنه با flowLayoutPanel1.Controls.Clear کار حل میشد
آیا به جای دستور
var button = (string.IsNullOrEmpty(Path.GetFileName(Path.GetDirectoryName(project.Folder))))flowLayoutPanel1.Controls[name];
از فرم دیگه ای نمیشه استفاده کرد؟چون این فرم رو قبول نمیکنه و به جای خاصیت Name مثلا بیام از Text استفاده کنم؟
flowLayoutPanel1 هم فقط AddChild رو داره برای button ها و البته Removechild وبقیش خاصیت هایی مثل ارتفاع و عرض و رنگ و ... هست
قطعا شدنی است اما چون ساختار Button مورد نظر رو نمیدونم نمیتوانم بر اساس ساختار Button ها پیشنهادی بکنم.
فرضا از طریق یک فیلد داخل کلاس مثلا با نام buttons_ که هر Button رو با نام مشخصی به خاطر می سپاره هم میشه اینکار رو کرد :
C#:
        private readonly Dictionary<string, Button> _buttons = new Dictionary<string, Button>();

C#:
            if (SCU)
            {
                var name = "buttonprice" + arn.ToString();
                Button button;
                if (_buttons.TryGetValue(name, out button) == false)
                {
                    button = new Button();
                    button.Click += Button_Click;
                    flowLayoutPanel1.AddChild(button);
                    _buttons.Add(name, button);
                }
                button.Text = arn;
                button.Margin = 0;
                button.FontSize = 11;
                button.ForegroundColor = CL;
                button.FontWeight = FontWeight.UltraBold;
                button.IsEnabled = arn != SymbolName;
                button.BackgroundColor = Color.Empty;
                if (button.IsEnabled == false)
                {
                    button.BackgroundColor = Color.LightBlue;
                }
            }
 

64hadi64

New Member
قطعا شدنی است اما چون ساختار Button مورد نظر رو نمیدونم نمیتوانم بر اساس ساختار Button ها پیشنهادی بکنم.
فرضا از طریق یک فیلد داخل کلاس مثلا با نام buttons_ که هر Button رو با نام مشخصی به خاطر می سپاره هم میشه اینکار رو کرد :
C#:
        private readonly Dictionary<string, Button> _buttons = new Dictionary<string, Button>();

C#:
            if (SCU)
            {
                var name = "buttonprice" + arn.ToString();
                Button button;
                if (_buttons.TryGetValue(name, out button) == false)
                {
                    button = new Button();
                    button.Click += Button_Click;
                    flowLayoutPanel1.AddChild(button);
                    _buttons.Add(name, button);
                }
                button.Text = arn;
                button.Margin = 0;
                button.FontSize = 11;
                button.ForegroundColor = CL;
                button.FontWeight = FontWeight.UltraBold;
                button.IsEnabled = arn != SymbolName;
                button.BackgroundColor = Color.Empty;
                if (button.IsEnabled == false)
                {
                    button.BackgroundColor = Color.LightBlue;
                }
            }
سلام و تشکر
این کد رو تونستم باهاش کار کنم فقط الان یک مشکل هست و اونهم اینکه وقتی شرایط مهیا میشه(SCU) ، کلیدهای جدید ساخته میشن اما قدیمی ها که دیگه الان شرایط رو ندارن پاک نمیشن و به همراه کلیدهای جدید نشون داده میشن
 

the_king

مدیرکل انجمن
سلام و تشکر
این کد رو تونستم باهاش کار کنم فقط الان یک مشکل هست و اونهم اینکه وقتی شرایط مهیا میشه(SCU) ، کلیدهای جدید ساخته میشن اما قدیمی ها که دیگه الان شرایط رو ندارن پاک نمیشن و به همراه کلیدهای جدید نشون داده میشن
هیچ چیزی خود به خود پاک نمی شه، اگر برای وقتی SCU ئه false باشه کدی نداشته باشید کاری هم برایش انجام نمیشه.
اول باید ببینید برای پنهان کردن یک button یا حذف کردنش چه مشخصه یا متدی قابل استفاده است.
 

64hadi64

New Member
هیچ چیزی خود به خود پاک نمی شه، اگر برای وقتی SCU ئه false باشه کدی نداشته باشید کاری هم برایش انجام نمیشه.
اول باید ببینید برای پنهان کردن یک button یا حذف کردنش چه مشخصه یا متدی قابل استفاده است.
ممنون
من تونستم فقط اینکار رو انجام و کد شما رو به شکل زیر بنویسم تا بتونه کلیدهای قبلی رو پنهان کنه
فقط این کد به دلم نمیشینه چون اولا button ها پنهان میشن ولی حذف نمیشن(مشخصه دیگه ای برای حذف نداشت)و فکر میکنم این کار سیستم رو درگیر میکنه البته محسوس نیست اما فکر میکنم استاندارد هم نیست و هر چه سیستم کمتر درگیر باشه نشانه کد زیباتریه
دوما الان با این کد سیستم ، میاد اول button ها رو میسازه و تازه بعد میاد شرایطش رو میسنجه که اینهم باز همون مشکل بالا رو داره
آیا راهی غیر از این نیست؟
 

64hadi64

New Member
کد:
{
                var name = "buttonprice" + arn.ToString();
                Button button;
                if (_buttons.TryGetValue(name, out button) == false)
                {
                    button = new Button();
                    button.Click += Button_Click;
                    flowLayoutPanel1.AddChild(button);
                    _buttons.Add(name, button);
                }
                button.Text = arn;
                button.Margin = 0;
                button.FontSize = 11;
                button.ForegroundColor = CL;
                button.FontWeight = FontWeight.UltraBold;
                button.IsEnabled = arn != SymbolName;
                button.BackgroundColor = Color.Empty;
                button.IsVisible = SCU;
                if (button.IsEnabled == false)
                {
                    button.BackgroundColor = Color.LightBlue;
                }
 

the_king

مدیرکل انجمن
ممنون
من تونستم فقط اینکار رو انجام و کد شما رو به شکل زیر بنویسم تا بتونه کلیدهای قبلی رو پنهان کنه
فقط این کد به دلم نمیشینه چون اولا button ها پنهان میشن ولی حذف نمیشن(مشخصه دیگه ای برای حذف نداشت)و فکر میکنم این کار سیستم رو درگیر میکنه البته محسوس نیست اما فکر میکنم استاندارد هم نیست و هر چه سیستم کمتر درگیر باشه نشانه کد زیباتریه
دوما الان با این کد سیستم ، میاد اول button ها رو میسازه و تازه بعد میاد شرایطش رو میسنجه که اینهم باز همون مشکل بالا رو داره
آیا راهی غیر از این نیست؟
در مورد سیستمی که شناختی ازش ندارم نمیتونم نظری بدم.
 

the_king

مدیرکل انجمن
حق با شماست
جهت آموزش می پرسم
اگر ممکنه همین رو با ساختار خود C# یه توضیحی بدین
زبان برنامه نویسی نقشی در این مساله نداره، باید بر اساس ساختار اون Button و flowLayoutPanel1 و اینکه چی داره و چی نداره فکری کرد.
مثلا اگه RemoveChild ای هست ازش استفاده کنید :
C#:
            var name = "buttonprice" + arn.ToString();
            Button button;
            if (SCU)
            {
                if (_buttons.TryGetValue(name, out button) == false)
                {
                    button = new Button();
                    button.Click += Button_Click;
                    flowLayoutPanel1.AddChild(button);
                    _buttons.Add(name, button);
                }
                button.Text = arn;
                button.Margin = 0;
                button.FontSize = 11;
                button.ForegroundColor = CL;
                button.FontWeight = FontWeight.UltraBold;
                button.IsEnabled = arn != SymbolName;
                button.BackgroundColor = Color.Empty;
                button.IsVisible = true;
                if (button.IsEnabled == false)
                {
                    button.BackgroundColor = Color.LightBlue;
                }
            }
            else if (_buttons.TryGetValue(name, out button))
            {
                flowLayoutPanel1.RemoveChild(button);
                _buttons.Remove(name);
            }
 

64hadi64

New Member
زبان برنامه نویسی نقشی در این مساله نداره، باید بر اساس ساختار اون Button و flowLayoutPanel1 و اینکه چی داره و چی نداره فکری کرد.
مثلا اگه RemoveChild ای هست ازش استفاده کنید :
C#:
            var name = "buttonprice" + arn.ToString();
            Button button;
            if (SCU)
            {
                if (_buttons.TryGetValue(name, out button) == false)
                {
                    button = new Button();
                    button.Click += Button_Click;
                    flowLayoutPanel1.AddChild(button);
                    _buttons.Add(name, button);
                }
                button.Text = arn;
                button.Margin = 0;
                button.FontSize = 11;
                button.ForegroundColor = CL;
                button.FontWeight = FontWeight.UltraBold;
                button.IsEnabled = arn != SymbolName;
                button.BackgroundColor = Color.Empty;
                button.IsVisible = true;
                if (button.IsEnabled == false)
                {
                    button.BackgroundColor = Color.LightBlue;
                }
            }
            else if (_buttons.TryGetValue(name, out button))
            {
                flowLayoutPanel1.RemoveChild(button);
                _buttons.Remove(name);
            }
عالی بود واقعا،با توجه به اینکه button های دیگه ای هم داشتم،سرعت خیلی فرق کرد و بهتر شد
البته قبل اینکه شمارو زحمت بدم همین کد رو اضافه کردم فقط حواسم به
_buttons.Remove(name); نبود که بنویسمش
ممنون
 

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

بالا