سوال در مورد CheckedListBox

MRHADI

Member
سلام
در کد زیر مشکلم این هست که وقتی در CheckedListBox ، آیتمی تیک میخوره بعد از 20 ثانیه اون آیتم در نظر گرفته میشه و Button مربوط به اون ساخته میشه
هر کدی هم براش نوشتم موفق نشدم طوری بنویسم که به محض تیک خوردن یک آیتم ، برنامه همون موقع اون آیتم رو در نظر بگیره و 20 ثانیه تاخیر تایمر منظور نشه
ممنون میشم راهنمایی کنید
کد:
            var TSN = new System.Windows.Forms.Timer();
            TSN.Enabled = true;
            TSN.Interval = 1
           
            TSN.Tick += (s, n) =>
            {
                _f1.flowLayoutPanel1.Controls.Clear();   

                   var TCLB1 = _f1.checkedListBox2.CheckedItems.Cast<TimeFrame>().ToArray();
         
                   TSN.Interval =20000

                foreach (var SN in symbolNames)
                 {
                     foreach (var TFFF in TTT)
                     {

                        #region PDH1
                        var PDH1 = MarketData.GetBars(TFFF, SN);

                         var hi = PDH1.HighPrices;
                         var lo = PDH1.LowPrices;
                         var cl = PDH1.ClosePrices;

                         sma50TF2 = Indicators.SimpleMovingAverage(cl, 50);

                        
                        #endregion PDH1


                        {

                             if (cl.Last(1) > sma50TF2.Result.Last(1) &&  ((lo.Last(2) < lo.Last(3) && lo.Last(2) < lo.Last(4) && lo.Last(2) < lo.Last(5) && lo.Last(2) < lo.Last(6) && lo.Last(2) < lo.Last(7)) || (lo.Last(1) < lo.Last(2) && lo.Last(1) < lo.Last(3) && lo.Last(1) < lo.Last(4) && lo.Last(1) < lo.Last(5) && lo.Last(1) < lo.Last(6))))
                             {
                                 SCUTF2 = true;
                                 CL = System.Drawing.Color.Blue;

                             }

                             else if (cl.Last(1) < sma50TF2.Result.Last(1) &&  ((hi.Last(2) > hi.Last(3) && hi.Last(2) > hi.Last(4) && hi.Last(2) > hi.Last(5) && hi.Last(2) > hi.Last(6) && hi.Last(2) > hi.Last(7)) || (hi.Last(1) > hi.Last(2) && hi.Last(1) > hi.Last(3) && hi.Last(1) > hi.Last(4) && hi.Last(1) > hi.Last(5) && hi.Last(1) > hi.Last(6))))
                             {
                                 SCUTF2 = true;
                                 CL = System.Drawing.Color.Red;

                             }
                             else
                             {
                                 SCUTF2 = false;
                                 CL = System.Drawing.Color.Empty;
                             }

                         }

                       


                         if (SCUTF2 == true)
                        {
                            #region BTN1

                            foreach (var tc in TCLB1)
                            {


                                var BTN1 = new System.Windows.Forms.Button();
                                BTN1.Text = SN + " " + TT.ToString();
                                BTN1.ForeColor = CL;
                                BTN1.AutoSize = true;
                                BTN1.AutoSizeMode = AutoSizeMode.GrowAndShrink;
                                BTN1.FlatStyle = FlatStyle.Flat;



                                BTN1.Visible = (TFFF == tc);
                                _f1.flowLayoutPanel1.Controls.Add(BTN1);

                                {
                                    if (SN == SymbolName && TFFF == TimeFrame)

                                        BTN1.Enabled = false;
                                    else
                                        BTN1.Enabled = true;
                                }

                                BTN1.Click += (x, y) => { Chart.TryChangeTimeFrameAndSymbol(TFFF, SN); };

                                if (BTN1.Enabled == false)
                                    BTN1.BackColor = System.Drawing.Color.LightGreen;
                            }
                            #endregion BTN1


                         }

                     }


                 }
            };
 

the_king

مدیرکل انجمن
سلام
در کد زیر مشکلم این هست که وقتی در CheckedListBox ، آیتمی تیک میخوره بعد از 20 ثانیه اون آیتم در نظر گرفته میشه و Button مربوط به اون ساخته میشه
هر کدی هم براش نوشتم موفق نشدم طوری بنویسم که به محض تیک خوردن یک آیتم ، برنامه همون موقع اون آیتم رو در نظر بگیره و 20 ثانیه تاخیر تایمر منظور نشه
ممنون میشم راهنمایی کنید
اینطوری از تایمر استفاده نکنید، اولا هر 20 ثانیه یکبار دارید از نو دکمه ها رو میسازید، چه تیک ها تغییر کرده باشه و چه نکرده باشه.
ثانیا یک نگهبان ساخته اید که هر 20 ثانیه یکبار بیدار میشه و سرش رو از اتاقک نگهبانی میاره بیرون و بعد دوباره 20 ثانیه چرت میزنه. طبعا این تایمر تو واکنش تاخیر داره.
وقتی آیتمی تیک میخوره یا تیکش برداشته میشه رخداد ItemCheck رخ میده، این رخداد همونجایی است که باید کدتون رو اجرا کنید.
در این مورد دلیلی برای استفاده از تایمر 20 ثانیه ای نمی بینم چون شما یک کار دوره ای انجام نمی دهید. ممکنه تا چند دقیقه کاربر هیچ تیکی رو تغییر نده.
در کلاس فرم f1_ یک رخداد CheckedListBoxChanged تعریف کنید تا هر وقت تیک های یک CheckedListBox تغییر کرد رخ بده.
کد:
        public event EventHandler CheckedListBoxChanged;

        private Timer _checkedListBoxTimer;

        private void Form1_Load(object sender, EventArgs e)
        {
            _checkedListBoxTimer = new Timer() { Interval = 1, Enabled = false };
            _checkedListBoxTimer.Tick += checkedListBoxTimer_Tick;
            checkedListBox1.ItemCheck += checkedListBox_ItemCheck;
            checkedListBox2.ItemCheck += checkedListBox_ItemCheck;
        }

        private void checkedListBoxTimer_Tick(object sender, EventArgs e)
        {
            _checkedListBoxTimer.Enabled = false;
            CheckedListBoxChanged?.Invoke(_checkedListBoxTimer.Tag, EventArgs.Empty);
        }

        private void checkedListBox_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            _checkedListBoxTimer.Tag = sender;
            _checkedListBoxTimer.Enabled = true;
        }

حالا برگردید به کلاس فرمی که کد های قبلی خودتون رو نوشته بودید. الان برای f1_ یک رخداد CheckedListBoxChanged اضافه شده که میتونه بگه sender تغییر کرده.
اگر sender اون checkedListBox2 بود کدتون رو اجرا کنید، بدون تایمر.
فراموش نکنید که موقع ساختن f1_ اون رخداد CheckedListBoxChanged اش رو حتما به متد f1_CheckedListBoxChanged متصل کنید :
کد:
            _f1 = new Form1();
            _f1.CheckedListBoxChanged += f1_CheckedListBoxChanged;
            .
            .
            .

        private void f1_CheckedListBoxChanged(object sender, EventArgs e)
        {
            if (sender == _f1.checkedListBox2)
            {
                _f1.flowLayoutPanel1.Controls.Clear();
                var TCLB1 = _f1.checkedListBox2.CheckedItems.Cast<TimeFrame>().ToArray();
                foreach (var SN in symbolNames)
                {
                    foreach (var TFFF in TTT)
                    {
                        .
                        .
                        .
 

MRHADI

Member
اینطوری از تایمر استفاده نکنید، اولا هر 20 ثانیه یکبار دارید از نو دکمه ها رو میسازید، چه تیک ها تغییر کرده باشه و چه نکرده باشه.
ثانیا یک نگهبان ساخته اید که هر 20 ثانیه یکبار بیدار میشه و سرش رو از اتاقک نگهبانی میاره بیرون و بعد دوباره 20 ثانیه چرت میزنه. طبعا این تایمر تو واکنش تاخیر داره.
وقتی آیتمی تیک میخوره یا تیکش برداشته میشه رخداد ItemCheck رخ میده، این رخداد همونجایی است که باید کدتون رو اجرا کنید.
در این مورد دلیلی برای استفاده از تایمر 20 ثانیه ای نمی بینم چون شما یک کار دوره ای انجام نمی دهید. ممکنه تا چند دقیقه کاربر هیچ تیکی رو تغییر نده.
در کلاس فرم f1_ یک رخداد CheckedListBoxChanged تعریف کنید تا هر وقت تیک های یک CheckedListBox تغییر کرد رخ بده.
کد:
        public event EventHandler CheckedListBoxChanged;

        private Timer _checkedListBoxTimer;

        private void Form1_Load(object sender, EventArgs e)
        {
            _checkedListBoxTimer = new Timer() { Interval = 1, Enabled = false };
            _checkedListBoxTimer.Tick += checkedListBoxTimer_Tick;
            checkedListBox1.ItemCheck += checkedListBox_ItemCheck;
            checkedListBox2.ItemCheck += checkedListBox_ItemCheck;
        }

        private void checkedListBoxTimer_Tick(object sender, EventArgs e)
        {
            _checkedListBoxTimer.Enabled = false;
            CheckedListBoxChanged?.Invoke(_checkedListBoxTimer.Tag, EventArgs.Empty);
        }

        private void checkedListBox_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            _checkedListBoxTimer.Tag = sender;
            _checkedListBoxTimer.Enabled = true;
        }

حالا برگردید به کلاس فرمی که کد های قبلی خودتون رو نوشته بودید. الان برای f1_ یک رخداد CheckedListBoxChanged اضافه شده که میتونه بگه sender تغییر کرده.
اگر sender اون checkedListBox2 بود کدتون رو اجرا کنید، بدون تایمر.
فراموش نکنید که موقع ساختن f1_ اون رخداد CheckedListBoxChanged اش رو حتما به متد f1_CheckedListBoxChanged متصل کنید :
کد:
            _f1 = new Form1();
            _f1.CheckedListBoxChanged += f1_CheckedListBoxChanged;
            .
            .
            .

        private void f1_CheckedListBoxChanged(object sender, EventArgs e)
        {
            if (sender == _f1.checkedListBox2)
            {
                _f1.flowLayoutPanel1.Controls.Clear();
                var TCLB1 = _f1.checkedListBox2.CheckedItems.Cast<TimeFrame>().ToArray();
                foreach (var SN in symbolNames)
                {
                    foreach (var TFFF in TTT)
                    {
                        .
                        .
                        .
ممنون
در مورد تایمر استفادش اتفاقا در تیک خوردن یا نخوردن آیتم هه نیست
من از تایمر استفاده کردم تا هر 20 ثانیه اطلاعات مربوط به ساخت کلیدها رو آپدیت کنه و چون در این بین ممکنه یک یا چند کلید کم یا زیاد شده باشه بیاد و پنل رو پاک و از اول کلیدها رو بسازه
در مورد آیتم های CheckedListBox باید هم اطلاعات مربوط به ساخت کلیدها بروز شده باشن و هم تیک آیتم ها خورده باشه که در پست اول عرض کردم مشکلم چی هست
امیدوارم منظورم رو درست رسونده باشم
 

the_king

مدیرکل انجمن
ممنون
در مورد تایمر استفادش اتفاقا در تیک خوردن یا نخوردن آیتم هه نیست
من از تایمر استفاده کردم تا هر 20 ثانیه اطلاعات مربوط به ساخت کلیدها رو آپدیت کنه و چون در این بین ممکنه یک یا چند کلید کم یا زیاد شده باشه بیاد و پنل رو پاک و از اول کلیدها رو بسازه
در مورد آیتم های CheckedListBox باید هم اطلاعات مربوط به ساخت کلیدها بروز شده باشن و هم تیک آیتم ها خورده باشه که در پست اول عرض کردم مشکلم چی هست
امیدوارم منظورم رو درست رسونده باشم
اگر قراره هر 20 ثانیه یکبار Refresh بشه پس باید تا حتی 19 ثانیه تاخیر در به روز رسانی مشکلی نداشته باشید در حالی که در صورت سوال مشکل تون اینه که این تاخیر مطلوب نیست.
اگر قراره به محض تغییر در تیک ها نمایش دکمه ها بروز بشه، پس بعد 20 ثانیه میخواهید دیگه چه چیزی بروز بشه؟ بعد 20 ثانیه که هیچ، بعد 200 ثانیه هم نمایش همونه که به محض تغییر در تیک ها نمایش داده بودید، چیزی تغییر نکرده که بخاطرش Timer و بروز رسانی داشته باشید.
دکمه ها خود به خود که کم و زیاد نمیشن، با کد اضافه شدن و با کد هم حذف میشن. اگر به محض وقوع رخداد ItemCheck نمایش رو به روز کنید همواره دکمه ها با آیتم های تیک خورده مطابقت دارند و دیگه چیزی برای بررسی در تایمر نمی مونه.
از طرف دیگه f1.checkedListBox2.CheckedItems_ همواره گزینه های تیک خورده رو برمیگردونه، آیتم تیک نخورده در مجموعه اش نیست.
اگر برای منظور دیگری از تایمر استفاده می کنید نگهش دارید ولی برای بررسی تیک گزینه ها نه.
 

MRHADI

Member
اگر قراره هر 20 ثانیه یکبار Refresh بشه پس باید تا حتی 19 ثانیه تاخیر در به روز رسانی مشکلی نداشته باشید در حالی که در صورت سوال مشکل تون اینه که این تاخیر مطلوب نیست.
اگر قراره به محض تغییر در تیک ها نمایش دکمه ها بروز بشه، پس بعد 20 ثانیه میخواهید دیگه چه چیزی بروز بشه؟ بعد 20 ثانیه که هیچ، بعد 200 ثانیه هم نمایش همونه که به محض تغییر در تیک ها نمایش داده بودید، چیزی تغییر نکرده که بخاطرش Timer و بروز رسانی داشته باشید.
دکمه ها خود به خود که کم و زیاد نمیشن، با کد اضافه شدن و با کد هم حذف میشن. اگر به محض وقوع رخداد ItemCheck نمایش رو به روز کنید همواره دکمه ها با آیتم های تیک خورده مطابقت دارند و دیگه چیزی برای بررسی در تایمر نمی مونه.
از طرف دیگه f1.checkedListBox2.CheckedItems_ همواره گزینه های تیک خورده رو برمیگردونه، آیتم تیک نخورده در مجموعه اش نیست.
اگر برای منظور دیگری از تایمر استفاده می کنید نگهش دارید ولی برای بررسی تیک گزینه ها نه.
اگر قراره هر 20 ثانیه یکبار Refresh بشه پس باید تا حتی 19 ثانیه تاخیر در به روز رسانی مشکلی نداشته باشید در حالی که در صورت سوال مشکل تون اینه که این تاخیر مطلوب نیست.
اگر قراره به محض تغییر در تیک ها نمایش دکمه ها بروز بشه، پس بعد 20 ثانیه میخواهید دیگه چه چیزی بروز بشه؟ بعد 20 ثانیه که هیچ، بعد 200 ثانیه هم نمایش همونه که به محض تغییر در تیک ها نمایش داده بودید، چیزی تغییر نکرده که بخاطرش Timer و بروز رسانی داشته باشید.
دکمه ها خود به خود که کم و زیاد نمیشن، با کد اضافه شدن و با کد هم حذف میشن. اگر به محض وقوع رخداد ItemCheck نمایش رو به روز کنید همواره دکمه ها با آیتم های تیک خورده مطابقت دارند و دیگه چیزی برای بررسی در تایمر نمی مونه.
از طرف دیگه f1.checkedListBox2.CheckedItems_ همواره گزینه های تیک خورده رو برمیگردونه، آیتم تیک نخورده در مجموعه اش نیست.
اگر برای منظور دیگری از تایمر استفاده می کنید نگهش دارید ولی برای بررسی تیک گزینه ها نه.
فرمایش شما درسته
من غیر از BTN1 کلیدهای دیگه هم دارم که ربطی به CheckedListBox ندارن و باید مدام آپدیت بشن
اینکه تایمر رو برای CheckedListBox هم بکار بردم به این خاطر بود که در مواقعی هم که برای مدتی تیک ها تغییر نکنند ،ممکنه اطلاعات دیگه مربوط به ساخت کلیدها تغییر کنن و نیتم این بود که آپدیت باشن
البته من هنوز موفق نشدم کدی رو که زحمت کشیدید نوشتید ازش استفاده کنم و چندتا خطا میده
بازم سعیم رو میکنم و اگر موفق نشدم ، مزاحم میشم
عکس پیغام خطا رو گذاشتم
 

پیوست ها

  • sshot-9.jpg
    sshot-9.jpg
    175.9 کیلوبایت · بازدیدها: 1

the_king

مدیرکل انجمن
فرمایش شما درسته
من غیر از BTN1 کلیدهای دیگه هم دارم که ربطی به CheckedListBox ندارن و باید مدام آپدیت بشن
اینکه تایمر رو برای CheckedListBox هم بکار بردم به این خاطر بود که در مواقعی هم که برای مدتی تیک ها تغییر نکنند ،ممکنه اطلاعات دیگه مربوط به ساخت کلیدها تغییر کنن و نیتم این بود که آپدیت باشن
البته من هنوز موفق نشدم کدی رو که زحمت کشیدید نوشتید ازش استفاده کنم و چندتا خطا میده
بازم سعیم رو میکنم و اگر موفق نشدم ، مزاحم میشم
عکس پیغام خطا رو گذاشتم
اون .? یکی از عملگر های نسبتا جدید #C ئه که ویژوال استدیو تون نمیشناسه. بهش میگن عملگر null propagation که شبیه به . ئه با این تفاوت که حواسش به null بودن مقدار هست.
فرق .? با . در اینه که اگر مقدار طرف چپ null باشه (در این مثال مقدار CheckedListBoxChanged)، شی ای وجود نداره که فرضا Invoke رویش اجرا بشه و طبعا دسترسی به Invoke با . برای شی ای که null بوده ممکن نیست و خطا ایجاد میشه و برنامه در اون قسمت متوقف میشه :
کد:
CheckedListBoxChanged.Invoke(_checkedListBoxTimer.Tag, EventArgs.Empty);
اما .? بجای اینکه خطای null بودن ایجاد کنه، از خیر مقدار دهی میگذره و خودش مقدار null رو برمیگردونه (در این مثال از مقدار بازگشتی استفاده ای نمیشه) و خطایی ایجاد نمی کنه :
کد:
CheckedListBoxChanged?.Invoke(_checkedListBoxTimer.Tag, EventArgs.Empty);
در جایی که احتمال null بودن هست، استفاده از .? کمک می کنه که جلوی بروز خطا گرفته بشه.
بجایش می توانیم با if بررسی null نبودن رو انجام بدهیم تا اگر null بود از خیر Invoke کردن بگذریم و از بروز خطا اجتناب کنیم :
کد:
            var c = CheckedListBoxChanged;
            if (c != null)
            {
                c.Invoke(_checkedListBoxTimer.Tag, EventArgs.Empty);
            }
 

MRHADI

Member
اون .? یکی از عملگر های نسبتا جدید #C ئه که ویژوال استدیو تون نمیشناسه. بهش میگن عملگر null propagation که شبیه به . ئه با این تفاوت که حواسش به null بودن مقدار هست.
فرق .? با . در اینه که اگر مقدار طرف چپ null باشه (در این مثال مقدار CheckedListBoxChanged)، شی ای وجود نداره که فرضا Invoke رویش اجرا بشه و طبعا دسترسی به Invoke با . برای شی ای که null بوده ممکن نیست و خطا ایجاد میشه و برنامه در اون قسمت متوقف میشه :
کد:
CheckedListBoxChanged.Invoke(_checkedListBoxTimer.Tag, EventArgs.Empty);
اما .? بجای اینکه خطای null بودن ایجاد کنه، از خیر مقدار دهی میگذره و خودش مقدار null رو برمیگردونه (در این مثال از مقدار بازگشتی استفاده ای نمیشه) و خطایی ایجاد نمی کنه :
کد:
CheckedListBoxChanged?.Invoke(_checkedListBoxTimer.Tag, EventArgs.Empty);
در جایی که احتمال null بودن هست، استفاده از .? کمک می کنه که جلوی بروز خطا گرفته بشه.
بجایش می توانیم با if بررسی null نبودن رو انجام بدهیم تا اگر null بود از خیر Invoke کردن بگذریم و از بروز خطا اجتناب کنیم :
کد:
            var c = CheckedListBoxChanged;
            if (c != null)
            {
                c.Invoke(_checkedListBoxTimer.Tag, EventArgs.Empty);
            }
چه عملگر کار راه بندازی
چرا نمیشناسه؟باید چه کرد
 

the_king

مدیرکل انجمن
چه عملگر کار راه بندازی
چرا نمیشناسه؟باید چه کرد
هر بار که ویژوال استدیو نسخه جدیدتری تولید میشه نسخه #C جدیدتری هم باهاش معرفی میشه که امکانات و قابلیت های بیشتری داره، باید ویژوال استدیو نسخه جدیدتری نصب کنید.
 

MRHADI

Member
هر بار که ویژوال استدیو نسخه جدیدتری تولید میشه نسخه #C جدیدتری هم باهاش معرفی میشه که امکانات و قابلیت های بیشتری داره، باید ویژوال استدیو نسخه جدیدتری نصب کنید.
فرمودید شما هم 2017 استفاده میکنید
پس چرا مال من پشتیبانی نمیکنه این عملگر رو؟
 

MRHADI

Member
آیا امکانش هست آیتم های CheckedListBox رو به صورت کشویی داشته باشیم؟مثل ComboBox
 

the_king

مدیرکل انجمن
فرمودید شما هم 2017 استفاده میکنید
پس چرا مال من پشتیبانی نمیکنه این عملگر رو؟
بحث همون Language version در تنظیمات پروژه است، مادامی که روی نسخه 6.0 به بعد قرار نگیره پشتیبانی اش نمی کنه.
language.png

آیا امکانش هست آیتم های CheckedListBox رو به صورت کشویی داشته باشیم؟مثل ComboBox
در خود NET Framework. کنترل استانداردی با این قابلیت نیست، ولی کنترل های متفرقه هست که باید به پروژه تون کد یا dll اش رو اضافه کنید.
Common.CheckComboBox 1.0.0
A ComboBox with a CheckedListBox as a Dropdown
 

MRHADI

Member
بحث همون Language version در تنظیمات پروژه است، مادامی که روی نسخه 6.0 به بعد قرار نگیره پشتیبانی اش نمی کنه.
مشاهده پیوست 113446


در خود NET Framework. کنترل استانداردی با این قابلیت نیست، ولی کنترل های متفرقه هست که باید به پروژه تون کد یا dll اش رو اضافه کنید.
Common.CheckComboBox 1.0.0
A ComboBox with a CheckedListBox as a Dropdown
ممنون
اتفاقا وقتی دیدم پشتیبانی نمیکنه اولین کاری که کردم چک کردم همین قسمت بود که روی گزینه اول گذاشته بودم و بود
در مورد 2تا لینکی که زحمت کشیدین دومی دانلود و مشخصه ولی اولی رو نفهمیدم چطوری باید عمل کنم
دومی فقط همین Properties.Resources.Designer.cs.dll رو داره که dll هست،همینو باید اضافه کنم؟
 

the_king

مدیرکل انجمن
ممنون
در مورد 2تا لینکی که زحمت کشیدین دومی دانلود و مشخصه ولی اولی رو نفهمیدم چطوری باید عمل کنم
دومی فقط همین Properties.Resources.Designer.cs.dll رو داره که dll هست،همینو باید اضافه کنم؟
نه. اگر دیدید پروژه ای رو دانلود می کنید و اینطوری به تنهایی اجرا میشه، یک پروژه اجرایی exe است، کتابخانه dll نیست. کتابخانه dll به تنهایی قابل اجرا نیست.
باید فایل کد کنترل ای که لازم دارید (در اینجا CheckedComboBox.cs) رو در پروژه خودتون اضافه کنید (منوی ...Project > Add Existing Item ) و بعد یکبار Build کردن پروژه تون از بالای Toolbox انتخابش کنید.
اون پروژه های nuget هم یک سطر نوشتن که برای Package Manager در سطر فرمان <PM چه فرمانی رو تایپ کنید تا نصب بشه، مثلا ... Install-Package
در ویژوال استدیو منوی Tools > NuGet Package Manager > Package Manager Console به اون کنسول دسترسی دارید تا فرمانی رو تایپ کنید و از اینترنت دانلودش کنه و روی پروژه ای که باز شده نصب کنه.
البته اگه با لینک Download package در سایت nuget.org دانلودش هم بکنید، فایل nupkg اش در اصل یک فایل zip ئه و با ابزار هایی مثل WinRar می توانید از حالت Zip شده خارج اش کنید ولی اونطوری استفاده ازش تجربه میخواد.
 

MRHADI

Member
نه. اگر دیدید پروژه ای رو دانلود می کنید و اینطوری به تنهایی اجرا میشه، یک پروژه اجرایی exe است، کتابخانه dll نیست. کتابخانه dll به تنهایی قابل اجرا نیست.
باید فایل کد کنترل ای که لازم دارید (در اینجا CheckedComboBox.cs) رو در پروژه خودتون اضافه کنید (منوی ...Project > Add Existing Item ) و بعد یکبار Build کردن پروژه تون از بالای Toolbox انتخابش کنید.
اون پروژه های nuget هم یک سطر نوشتن که برای Package Manager در سطر فرمان <PM چه فرمانی رو تایپ کنید تا نصب بشه، مثلا ... Install-Package
در ویژوال استدیو منوی Tools > NuGet Package Manager > Package Manager Console به اون کنسول دسترسی دارید تا فرمانی رو تایپ کنید و از اینترنت دانلودش کنه و روی پروژه ای که باز شده نصب کنه.
البته اگه با لینک Download package در سایت nuget.org دانلودش هم بکنید، فایل nupkg اش در اصل یک فایل zip ئه و با ابزار هایی مثل WinRar می توانید از حالت Zip شده خارج اش کنید ولی اونطوری استفاده ازش تجربه میخواد.
عالی بود و هر دو روش به درستی کار داد
ممنونم
اما چه کنم که همچنان با قفل شدن ComboBox ها مواجه هستم متاسفانه و همین CheckedComboBox ها هم قفل میشن
جالبه که همون آیتم های ComboBox رو داخل CheckedListBox هم دارم و CheckedListBox و همه کنترل ها و حتی Tab ها به درستی کار میکنن ولی ComboBox ها قفل میشن و واقعا شده یه معضل لاینحل
یه سوال دیگه ، من یک مجموعه رو توسط گزینه Items.AddRange به CheckedListBox دادم حالا میخوام یک آیتمی هم داشته باشم مثلا به اسم All که وقتی اون تیک میخوره همه آیتم ها تیک بوخوره و وقتی تیکش برداشته میشه همشون Uncheck بشن
لطفا راهنمایی بفرمایید
 

the_king

مدیرکل انجمن
عالی بود و هر دو روش به درستی کار داد
ممنونم
اما چه کنم که همچنان با قفل شدن ComboBox ها مواجه هستم متاسفانه و همین CheckedComboBox ها هم قفل میشن
جالبه که همون آیتم های ComboBox رو داخل CheckedListBox هم دارم و CheckedListBox و همه کنترل ها و حتی Tab ها به درستی کار میکنن ولی ComboBox ها قفل میشن و واقعا شده یه معضل لاینحل
شما یک برنامه دارید که فرمی که خودش بسته یا کاربر برنامه بسته یا توسط برنامه دیگری بسته شده رو هنوز بعد بسته شدن بکار می بره، کدی در کلاسش همچنان در حال اجرا است. مادامی که اون روال اجرا بشه از هر کنترلی که استفاده کنید اون کندی سر جاشه چون داره یک کدی در پشت پرده بیخودی و مجدد اجرا میشه که نباید میشده. اصل قضیه ایراد داره، چرا فرمی که باید باز مونه بسته میشه یا چرا باید فرمی که بسته شده همچنان بعد بسته شدن کد اجرا کنه.
یه سوال دیگه ، من یک مجموعه رو توسط گزینه Items.AddRange به CheckedListBox دادم حالا میخوام یک آیتمی هم داشته باشم مثلا به اسم All که وقتی اون تیک میخوره همه آیتم ها تیک بوخوره و وقتی تیکش برداشته میشه همشون Uncheck بشن
لطفا راهنمایی بفرمایید
به عنوان اولین عضو اون All رو اضافه کنید، بعد از طریق ItemCheck وضعیت اون آیتم اولی رو در نظر بگیرید.
کد:
        private void Form1_Load(object sender, EventArgs e)
        {
            checkedListBox1.Items.AddRange(new object[] { "All", "Red", "Green", "Blue" });
        }

        private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            var c = (CheckedListBox)sender;
            if ((c.Tag is bool) || (c.Items.Count == 0))
            {
                return;
            }
            c.Tag = true;
            if (e.Index == 0)
            {
                e.NewValue = (e.CurrentValue == CheckState.Unchecked) ? CheckState.Checked : CheckState.Unchecked;
                for (var i = 1; i < c.Items.Count; i++)
                {
                    c.SetItemChecked(i, e.NewValue != CheckState.Unchecked);
                }
            }
            else
            {
                var trueCount = (e.NewValue == CheckState.Unchecked) ? -1 : 1;
                for (var i = 1; i < c.Items.Count; i++)
                {
                    if (c.GetItemChecked(i))
                    {
                        trueCount++;
                    }
                }
                if (trueCount == 0)
                {
                    c.SetItemChecked(0, false);
                }
                else if (trueCount == c.Items.Count - 1)
                {
                    c.SetItemChecked(0, true);
                }
                else
                {
                    c.SetItemCheckState(0, CheckState.Indeterminate);
                }
            }
            c.Tag = null;
        }
 

MRHADI

Member
شما یک برنامه دارید که فرمی که خودش بسته یا کاربر برنامه بسته یا توسط برنامه دیگری بسته شده رو هنوز بعد بسته شدن بکار می بره، کدی در کلاسش همچنان در حال اجرا است. مادامی که اون روال اجرا بشه از هر کنترلی که استفاده کنید اون کندی سر جاشه چون داره یک کدی در پشت پرده بیخودی و مجدد اجرا میشه که نباید میشده. اصل قضیه ایراد داره، چرا فرمی که باید باز مونه بسته میشه یا چرا باید فرمی که بسته شده همچنان بعد بسته شدن کد اجرا کنه.
خب این یعنی راهی نیست؟یعنی نمیشه دستوری نوشت که کل فرم رو با تمام جزئیاتش ببنده وقتی بسته میشه؟بعد برام جای تعجبه که فقط کمبوباکس ها قفل میشن و همه چی درست کار میکنه
به عنوان اولین عضو اون All رو اضافه کنید، بعد از طریق ItemCheck وضعیت اون آیتم اولی رو در نظر بگیرید.
جنس مجموعه add شده string یا object نیست ، قبول نمیکنه بخوام یک all رو جداگانه بهش add کنم،گذشته از اون من بعد از add شدن اون مجموعه تبدیلش میکنم و ازش استفاده میکنم (کد زیر)
کد:
var TTT = _f1.checkedListBox2.Items.Cast<TimeFrame>().ToArray();
فکر کنم یه راهش اینه اگر بشه all رو به این مجموعه اضافه کنم(که نتونستم)بعد باید بیام در هنگام استفاده از کد بالا all رو یجوری ازش کم کنم
راه بهتری که پیدا کردم اینه که بیام مثلا یک Button1 براش بسازم و وظیفه Check یا Uncheck کردن همه آیتم ها رو به اون بدم
 

the_king

مدیرکل انجمن
خب این یعنی راهی نیست؟یعنی نمیشه دستوری نوشت که کل فرم رو با تمام جزئیاتش ببنده وقتی بسته میشه؟بعد برام جای تعجبه که فقط کمبوباکس ها قفل میشن و همه چی درست کار میکنه
فرم برای بسته شدن مشکلی نداره، اون برنامه و کدی که ازش استفاده می کنه است که مشکل ایجاد کرده، اون رو باید برطرف کنید.
وگرنه هر فرمی که بسته میشه خودش که درگیر کننده نیست، ایراد در فرم نیست. یک روال مجزا دارید که گیر داده به فرم بسته شده، نه خود فرم ئه.
چون از برنامه تون اطلاعی ندارم در مورد وضعیت کمبوباکس ها نظری نمی تونم بدم.
جنس مجموعه add شده string یا object نیست ، قبول نمیکنه بخوام یک all رو جداگانه بهش add کنم،گذشته از اون من بعد از add شدن اون مجموعه تبدیلش میکنم و ازش استفاده میکنم (کد زیر)
کد:
var TTT = _f1.checkedListBox2.Items.Cast<TimeFrame>().ToArray();
فکر کنم یه راهش اینه اگر بشه all رو به این مجموعه اضافه کنم(که نتونستم)بعد باید بیام در هنگام استفاده از کد بالا all رو یجوری ازش کم کنم
راه بهتری که پیدا کردم اینه که بیام مثلا یک Button1 براش بسازم و وظیفه Check یا Uncheck کردن همه آیتم ها رو به اون بدم
اگر ساختار TimeFrame دست شما است، می توانید یک All به تعریفش اضافه کنید و هر زمان هم خواستید می توانید All رو ازش حذف کنید :
کد:
var TTT = (from c in ii.Cast<TimeFrame>() where c != TimeFrame.All select c).ToArray();
 

MRHADI

Member
var TTT = (from c in ii.Cast<TimeFrame>() where c != TimeFrame.All select c).ToArray();
سپاسگذارم
در این کد من باید _f1.checkedListBox2.Items رو جایگزین ii میکردم دیگه؟من این کارو کردم ولی خطا داد(عکس زیر)
در ضمن All رو به صورت جداگانه با کد زیر به مجموعه checkedListBox اضافه کردم
کد:
            _f1.checkedListBox2.Items.Add("All");
 

پیوست ها

  • sshot-11.jpg
    sshot-11.jpg
    211 کیلوبایت · بازدیدها: 1

the_king

مدیرکل انجمن
سپاسگذارم
در این کد من باید _f1.checkedListBox2.Items رو جایگزین ii میکردم دیگه؟من این کارو کردم ولی خطا داد(عکس زیر)
در ضمن All رو به صورت جداگانه با کد زیر به مجموعه checkedListBox اضافه کردم
کد:
            _f1.checkedListBox2.Items.Add("All");
نه، منظورم این نبود که "All" رو بصورت string اضافه کنید و بعد دنبال TimeFrame.All بگردید. "All" هیچ ارتباطی با TimeFrame.All نداره.
قرار بود در TimeFrame اون All رو مثل بقیه موارد تعریف کنید، همانطور که Weekly رو تعریف کرده اید و بعد خود TimeFrame.All رو که یک TimeFrame ئه Add کنید نه "All" رو که یک string ئه.
اون خطا به =! هم در مورد اینه که نمیدونه چطور مقایسه رو انجام بده. چون نمیدونم TimeFrame رو چطوری تعریف کرده اید نمی توانم در مورد جزئیاتش توضیح بدم.
 

MRHADI

Member
نه، منظورم این نبود که "All" رو بصورت string اضافه کنید و بعد دنبال TimeFrame.All بگردید. "All" هیچ ارتباطی با TimeFrame.All نداره.
قرار بود در TimeFrame اون All رو مثل بقیه موارد تعریف کنید، همانطور که Weekly رو تعریف کرده اید و بعد خود TimeFrame.All رو که یک TimeFrame ئه Add کنید نه "All" رو که یک string ئه.
اون خطا به =! هم در مورد اینه که نمیدونه چطور مقایسه رو انجام بده. چون نمیدونم TimeFrame رو چطوری تعریف کرده اید نمی توانم در مورد جزئیاتش توضیح بدم.
آها بله متوجه شدم
نه این Weekly و ... رو من تعریف نکردم و آرایه های از قبل تعریف شدس و نمیتونم چیزی غیر از آرایه های خودش بهش اضافه کنم به همین خاطر مجبور شدم به صورت string اضافش کنم
 

پیوست ها

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

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

بالا