70٪ تخفیف ویژه جشنواره تابستانه توسینسو
پایان تخفیف تا:
مشاهده دوره‌ها
0

حذف و پاک کردن رکورد از دیتابیس با چک باکس DataGridView تلریک

سلام به دوستان و اساتید . توی یه برنامه سی شارپی که بصورت وین فرم دارم مینویسم در تمام قسمت های برنامه از گریدویو تلریک استفاده کردم . من میخوام برای حذف اطلاعات از دیتابیس یک ستون درون گرید ویو تلریک درست کنم که بصورت چک باکسی باشه و بعدش مواردی رو که کاربر تیک میزنه رو بصورت تجمعی از دیتابیس پاک کنم (دنبال این روش هستم روش multiple select بدردم نمیخوره)

توی کار با for مشکلی ندارم دستور پاک کردن یک رکورد از دیتابیس رو هم میدونم ولی اینکه چطوری چک کنم ببینم کدوم رکوردها چک خوردن یا نه رو بلد نیستم خیلی هم جستجو کردم اما تا دلتون بخواد برای دیتاگرید ویو معمولی وجود داره اما متاسفانه برای تلریک پیدا نکردم.ممنون میشم هر کس میدونه راهنمایی کنه ، متشکرم

پرسیده شده در 1396/12/07 توسط

14 پاسخ

0

ممنون دوست عزیز

خب با این کار فکر کنم تا اینجای کار موفق شدیم تیک دار شدن یا نشدن اون ردیف رو بگیریم و تبدیلش کنیم

خب الان من میخوام بگم که این رکورد رو حذف کنه دقیقا باید بگم که مثلا برو رکوردی رو حذف کن که id اون فلان هست اون فلان توی کدی که شما گذاشتی کدوم میشه؟؟؟

ببخشید گیج میزنم

منظورم اینه :

DELETE FROM mytable WHERE ID = @myID

خب @myID رو برابر با چی قرار بدم

ممنون ...

پاسخ در 1396/12/07 توسط
1

سلام

در کد که گفتم (//دستور ثبت اطلاعات

)شما عملیات حذف را می نویسی دیگه

@myID را هم برابر با

Convert.ToInt32(dataGridViewC1.Rows[i].Cells["ID"].Value

میکنی

پاسخ در 1396/12/08 توسط
1

سلام

private void btnEdit_Click(object sender, EventArgs e)
        {
            if (dataGridViewC1.RowCount <= 0) return;
            dataGridViewC1.EndEdit();
            for (var i = 0; i < dataGridViewC1.RowCount; i++)
            {
                if (!Convert.ToBoolean(dataGridViewC1.Rows[i].Cells["IsCheck"].Value)) continue;
                //دستور ثبت اطلاعات
            }
        }

مانند کد بالا عمل کن

پاسخ در 1396/12/07 توسط
1

سلام

(ولی الان که میخوام یه پیغام کلی بدم نمیدونم پیغام رو دقیقا کجا قرار بدم که بعدش حلقه for رو اجرا کنم )

قبل از اجرا دستور for بنویسید اگر yes ادامه بدهد وگرنه که هیچ

MessageBox.Show("Do", "Confirmation", messageBoxButtons.YesNoCancel);

(چطوری قبل از پیغام هشدار مبنی بر مطمئن بودن حذف ردیف ها بتونم بررسی کنم که آیا اصلا ردیفی تیک خورده یا نه)

کارمعقولی نیست الکی سرور را مشغول میکنید که چی

اما بازهم می تونید قبل MessageBox یک for نویسی که ایا ردیفی تیک خودره است یا نه که به اولین تیک رسیدی از دستور for خارج شوی تا انتها الکی دستور ادامه پیدا نکنه

اما این کار ضرورتی نداره

چون شما از کاربر صحت را میپرسید واین چک کردن سیستم برای چی است؟!

پاسخ در 1396/12/12 توسط
0

سلام مجدد این مورد آخر رو کسی راهنمایی نمی کنه حل بشه

متشکرم ...

پاسخ در 1396/12/13 توسط
0

از دوستان کسی نیست بتونه کمک کنه

خودم چندین روش رو امتحان کردم ولی نشد که نشد

ممنون میشم راهنمایی کنید

پاسخ در 1396/12/10 توسط
0

ممنون دوست عزیز

بعله من هم دقیقا منظورم همین هست که بعد از اینکه ردیف های تیک خوردند یک پیام هشدار بدم مبنی بر اینکه آیا از حذف ردیف های انتخاب شده مطمئن هستید یا خیر؟

و پس از yes دادن اینکار انجام بشه

اگر بخوام برای هر ردیف اینکار رو بکنم که اولا غیر منطقی هست و دوما برای این قضیه که میتونستم دقیقا پیغام هشدار رو داخل همون حلقه for قرار بدم و شدنی بود ولی الان که میخوام یه پیغام کلی بدم نمیدونم پیغام رو دقیقا کجا قرار بدم که بعدش حلقه for رو اجرا کنم

این یک موضوع و دومین موضوع اینکه چطوری قبل از پیغام هشدار مبنی بر مطمئن بودن حذف ردیف ها بتونم بررسی کنم که آیا اصلا ردیفی تیک خورده یا نه ...؟؟

در مورد این دو موضوع ممنون میشم توی کدنویسیش راهنمایی کنید

(همانطور که قبلا هم گفتم اگر این دو مورد رو بتونم حل کنم از این موضوع توی بقیه قسمت ها هم میخوام استفاده کنم مثل ارسال ردیف های تیک خورده برای چاپ)

بی نهایت سپاسگزارم

پاسخ در 1396/12/12 توسط
0

از کاربر عزیز abolfazlab خالصانه تشکر می کنم که بی منت وقت میگذارند و راهنمایی می کنند

در مورد اینکه اول بررسی کنیم که آیا ردیفی تیک خورده یا نه باید به این موضوع اشاره کنم که اگر این کار رو انجام ندیم خیلی غیر استاندارد میشه

چون بدون اینکه هیچ ردیفی تیک خورده باشه اول یک پیغام هشدار میاد که آیا از حذف ردیف های انتخاب شده اطمینان دارید یا خیر !!!

در صورتیکه هیچ ردیفی تیک نخورده و در ضمن اگر کاربر yes یا no رو بزنه هیچ اتفاقی نمیفته که اصلا جالب نمیشه

بنابراین من اومد و به روش زیر عمل کردم :

اول یک بولین تعریف کردم

        private bool ischeck;

و بعد در رویداد کلیک دکمه این رو نوشتم

            for (int x = 0; x < rgv.RowCount; x++)
            {
                ischeck = Convert.ToBoolean(rgv.Rows[x].Cells[0].Value);
            }

            if (ischeck == true)
            {
                MessageBox mb = new MessageBox();
                mb.lblmatn.Text = "از حذف ردیف های انتخاب شده اطمینان دارید؟";
                mb.btnyes.Visible = true;
                mb.btnno.Visible = true;
                mb.btnok.Visible = false;
                mb.ShowDialog();
                if (mb.result == true)
                {
                    for (var i = 0; i < rgv.RowCount; i++)
                    {
                        var melli = rgv.Rows[i].Cells[4].Value;
                        string id = melli.ToString();
                        if (!Convert.ToBoolean(rgv.Rows[i].Cells[0].Value)) continue;
                        tbl_stbase tbl_stbase = database.tbl_stbase.First(j => j.melli == id && j.year == lblyear.Text);
                        database.tbl_stbase.Remove(tbl_stbase);
                    }
                    database.SaveChanges();
                    loadrgv();
                }
                else
                {
                    rgv.EndEdit();
                }
            }
            else
            {
                MessageBox mb = new MessageBox();
                mb.lblmatn.Text = "ابتدا یک ردیف را انتخاب نمایید";
                mb.btnyes.Visible = false;
                mb.btnno.Visible = false;
                mb.btnok.Visible = true;
                mb.ShowDialog();
            }

الان فقط یه مشکل داره فقط در حالتی از if اول رد میشه یعنی هشدار (ابتدا یک ردیف رو انتخاب کنید رو نمی ده) که همه ی ردیف های موجود انتخاب بشن

باید کد for اول رو چطوری تغییر بدم که با بررسی اولین ردیف تیک خورده اون if اول رو رد کنه و بره سراغ هشدار دوم

متشکرم

پاسخ در 1396/12/12 توسط
0

اساتید کسی راه حلی به ذهنش نمی رسه !!!!؟؟؟؟ ...

ببینید در واقع من میخوام اول بررسی کنم که آیا ردیفی تیک خورده یا نه که اگر خواستم با یک پیغام هشدار به کاربر بگم که اول ردیفی رو تیک بزنه بعد اقدام به پاک کردن ردیف ها بکنه (البته میشه با یک if درصورتیکه ردیفی تیک خورده بود یا نه دکمه حذف رو غیرفعال یا فعال هم کرد ولی در هر دو حالت باید اول بتونم چک خوردن یا نخوردن ردیف ها رو چک کنم)

دوم اینکه وقتی ردیفی تیک خورده بود و اقدام به کلیک روی حذف اطلاعات کرد با یک سوال yes یا no کار رو به پیش ببرم

اگر no رو کلیک کرد ردیف های تیک خورده رو به حالت اولش برگردونم که بوسیله تکه کد :

dataGridViewC1.EndEdit();

کار انجام میشه

و اگر yes رو کلیک کرد بوسیله همون حلقه for ردیف های تیک خورده رو پاک کنم

فکر می کنم این متدی که گفتم اصولی باشه

دقیقا من الان با بحث چک کردن ردیف های تیک خورده یا نخورده مشکل دارم

فکر کنم باید از یکی از event های گرید ویو تلریک استفاده کنم درسته؟؟؟

لطفا اساتید راهنمایی بفرمایند

متشکرم

پاسخ در 1396/12/11 توسط
1

سلام

 for (var i = 0; i < rgv.RowCount; i++)
            {
                var melli = rgv.Rows[i].Cells[4].Value;
                string id = melli.ToString();
                if (!Convert.ToBoolean(rgv.Rows[i].Cells[0].Value)) continue;
                tbl_stbase tbl_stbase = database.tbl_stbase.First(j => j.melli == id && j.year == lblyear.Text);
                database.tbl_stbase.Remove(tbl_stbase);
                database.SaveChanges();
}

شما در کد بالا

دستور

   database.SaveChanges();

داخل دسستور for قرار داده اید درصورتیکه بخواهید چندین رکورد را باهم حذف کنید عمل اشتباه است چون اگر وسط کار بهر دلیل این عملیات ناقص بماند چندین رکورد عملیات را باموفقیت انجام داده اند و چندین رکورد ناموفق

پس بهتر است دستور

  database.SaveChanges();

بعداز for قرار گیرد

پاسخ در 1396/12/12 توسط
0

ممنون جناب ابوالفضل خان ...

بعله با این کد مشکلم حل شد :

var ischeck = false;
            for (int x = 0; x < rgv.RowCount; x++)
            {
                ischeck = Convert.ToBoolean(rgv.Rows[x].Cells[0].Value);
                if (ischeck)
                {
                    break;
                }
            }

و اما در خصوص این کد :

 MessageBox mb = new MessageBox();
                mb.lblmatn.Text = "از حذف ردیف های انتخاب شده اطمینان دارید؟";
                mb.btnyes.Visible = true;
                mb.btnno.Visible = true;
                mb.btnok.Visible = false;
                mb.ShowDialog();

این همون دیالوگ ریزالت هست در واقع که من خودم ساختم و برای پروژه های خودم ازش استفاده می کنم در واقع یک مسیج باکس کاستومایز شده هست با سه دکمه تایید ، بلی ، خیر و یک متن که هر بار خواستم سوالی بپرسم یا هشداری بدم ازش به اقتضا مسئله استفاده می کنم

ممنون جناب ابوالفضل خان ... 

بعله با این کد مشکلم حل شد : 
<c#>
var ischeck = false;
            for (int x = 0; x < rgv.RowCount; x++)
            {
                ischeck = Convert.ToBoolean(rgv.Rows[x].Cells[0].Value);
                if (ischeck)
                {
                    break;
                }
            }
<c#>

و اما در خصوص این کد : 
<c#>
 MessageBox mb = new MessageBox();
                mb.lblmatn.Text = از حذف ردیف های انتخاب شده اطمینان دارید؟;
                mb.btnyes.Visible = true;
                mb.btnno.Visible = true;
                mb.btnok.Visible = false;
                mb.ShowDialog();
<c#>
این همون دیالوگ ریزالت هست در واقع که من خودم ساختم و برای پروژه های خودم ازش استفاده می کنم در واقع یک مسیج باکس کاستومایز شده هست با سه دکمه تایید ، بلی ، خیر و یک متن که هر بار خواستم سوالی بپرسم یا هشداری بدم ازش به اقتضا مسئله استفاده می کنم 

||https://programming.tosinso.com/files/get/72d62d3b-b64c-41d0-986e-187d459f7ac7||

در نهایت از شما بابت راهنمایی های پی در پی تون متشکرم ، امثال این انجمن ها با حضور و فعالیت های شما عزیزان سر پا هست ... من به نوبه خودم از شما ممنون و سپاسگزارم

در نهایت از شما بابت راهنمایی های پی در پی تون متشکرم ، امثال این انجمن ها با حضور و فعالیت های شما عزیزان سر پا هست ... من به نوبه خودم از شما ممنون و سپاسگزارم

پاسخ در 1396/12/14 توسط
1

سلام

دقیقا نفهمیدم چی می خواهی

اما

 for (int x = 0; x < rgv.RowCount; x++)
            {
                ischeck = Convert.ToBoolean(rgv.Rows[x].Cells[0].Value);
            }

این کد شما اشتباه است چون این کد فقط وضیعت اخرین رکورد را برمیگرداند

کد را بصورت زیر تغییر بدهید

var ischeck = false;
            for (int x = 0; x < rgv.RowCount; x++)
            {
                ischeck = Convert.ToBoolean(rgv.Rows[x].Cells[0].Value);
                if (ischeck)
                {
                    break;
                }
            }

اگر به اولین true رسید فاز بعدی اجرا میشود ولازم نیست کل سطرها را پیمایش کند

درمورد

 MessageBox mb = new MessageBox();
                mb.lblmatn.Text = "از حذف ردیف های انتخاب شده اطمینان دارید؟";
                mb.btnyes.Visible = true;
                mb.btnno.Visible = true;
                mb.btnok.Visible = false;
                mb.ShowDialog();

نمی دانم برای چی نوشته اید اما بهتر از dialogresult استفاده کنید

DialogResult result = MessageBox.Show("Do you want to save changes?", "Confirmation", MessageBoxButtons.YesNoCancel);
if(result == DialogResult.Yes)
{ 
    //...
}
else if (result == DialogResult.No)
{ 
    //...
}
else
{
    //...
} 
پاسخ در 1396/12/14 توسط
1

سلام

الف ) اگر برایتان مهم است تک تک ردیفها را از کاربر yes,no بگیرید وبعد عملیات حذف را انجام بدهید

چک باکس را بردارید و بگذارید کاربر روی هر ردیفی دابل کلیک کرد سوال بپرسیدو عملیات مورد نظر را انجام بدهید

ب)اگر مهم نیست بعداز کلیک روی دکمه حذف یک سوال کلی بپرسید وبعد عملیات را انجام بدهید

اینکه شما بیاید یک سری از مقادیر را کاربر انتخاب کند و بعد برای هرکدام سوال بپرسید اصلا جالب و هم کاربر پسند نیست

(فرض کنید 100تا ردیف از 500 ردیف را بخواهد حذف کند آیا باید 100بار به این سوال پاسخ بدهد که موافق هستید یا نه)

پاسخ در 1396/12/12 توسط
0

ممنون بالاخره بوسیله کد زیر موفق شدم انجامش بدم

            for (var i = 0; i < rgv.RowCount; i++)
            {
                var melli = rgv.Rows[i].Cells[4].Value;
                string id = melli.ToString();
                if (!Convert.ToBoolean(rgv.Rows[i].Cells[0].Value)) continue;
                tbl_stbase tbl_stbase = database.tbl_stbase.First(j => j.melli == id && j.year == lblyear.Text);
                database.tbl_stbase.Remove(tbl_stbase);
                database.SaveChanges();
}

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

در صورتیکه خیر رو کلیک کرد تیک های خورده شده رو حذف کنم با دستور

dataGridViewC1.EndEdit();

و اگر هم بله کلیک خورد اون موقع همین کدی که الان گذاشتم رو بگذارم و توی حلقه ردیف های تیک خورده رو حذف کنم

به نظرتون باید از لیست استفاده کنم و اونطوری ردیف های تیک خورده بشمارم که آیا تیک خورده یا نه

اگر با لیست حل میشه لطفا توی نوشتن کدش ممنون میشم راهنمایی کنید

نحوه کار با لیست رو بلدم ولی اینکه چطوری ردیف های تیک خورده رو بریزم درون لیست رو نمی دونم

اگر هم روش دیگه ای هست ممنون میشم بفرمایید

در نهایت من اگر بتونم این کار رو انجام بدم به وسیله همین روش توی ارسال اطلاعات جدولم برای چاپ هم میخوام استفاده کنم کلا این روش خیلی توی برنامه های ویندوزی کاربرد داره

متشکرم از اینکه وقت میگذارید و راهنمایی میکنید

پاسخ در 1396/12/09 توسط

پاسخ شما