نمایش نتایج 1 تا 13 از 13

نام تاپیک: کنترل بر خانه های GridView خالی

  1. #1

    کنترل بر خانه های GridView خالی

    با سلام ;


    من تو فرمم یه دونه DataTable و یه دونه GridView دارم , که هر دوتاشون در اول خالی هستند !
    بعدا توسط دو تا TExtBox بوسیله کاربر پر میشن ; اول datatable پر میشه و اونوقت کهGridview , Data source اش رو datatable قرار دادیم , gridview هم پر میشه !

    حالا یه مشکلی که دارم اینکه که چطور بتونم بر تک تک سلولهای GridView کنترل داشته باشم ؟؟
    اگه فقط بتونم هنگام ویرایش یک Col اون خونه رو validate کنم واسم کافیه !



    با تشکر




  2. #2
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    36
    پست
    1,491
    خوب متوجه نشدم... اگر منظورت فقط نوع رویداد هست که میتونی از رویداد CellEndEdit استفاده کنی و بعد از اون چک کنی که مقدار وارد شده قابل قبول هست یا نه. از CellValidating یا CellValueChanged هم میشه استفاده کرد.
    مثلا به کمک رویداد CellBeginEdit مقدار فعلی خونه را در یک متغیر مثل mm ذخیره میکنی، بعدش در رویداد CellEndEdit اگر مقداری که توسط کاربر وارد شده بود، قابل قبول بود که هیچ، وگرنه مقدار قبلیش رو از متغیر mm به خونه مورد نظر برمیگردونی.

  3. #3
    فرض کن باید تو یک سلول باید تکست وارد کنه و تو یکی دیگه باید فقط عدد !

    من از کجا بدونم که الان کدوم خونه داره ویرایش میشه ؟؟

    اگه امکان داره یه مثال بزنید ؟

    موفق باشید

  4. #4
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    36
    پست
    1,491
    برای اینکه بدونیم چه خونه ای داره ویرایش میشه، از شئ e که بعنوان یک آرگومان به رویداد مورد نظر فرستاده شده، میشه استفاده کرد.
    e.RowIndex شماره رکوردی که یکی از فیلداش داره ویرایش میشه.
    e.ColumnIndex شماره فیلدی از اون رکورد هست که داره ویرایش میشه.

    مثلا:

    if(e.ColumnIndex == 2)
    {
    if(dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString() == "")
    // statement...
    }


    dataGridView1[e.ColumnIndex, e.RowIndex].Value مقدار خونه ای هست که ویرایش شده

  5. #5
    من طبق گفته شما انجام دادم , ولی هیچ کاری انجام نشد :


    private void GridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
    if (e.ColumnIndex == 0)
    {
    if (GridView1[e.ColumnIndex, e.RowIndex].Value.ToString() == "")
    {
    MessageBox.Show("error");
    }
    }
    }


    حتی اون کد رو تو روال CellValueChanged هم قرار دادم , ولی زمانی که مقدار یه خونه رو خالی میذارم هیچ پیام خطایی ظاهر نمیشه ;

    با تشکر

  6. #6
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    36
    پست
    1,491
    من همین الان امتحان کردم و پیغام error رو نمایش داد...
    البته چون (if (e.ColumnIndex == 0 رو گذاشتیم، پس این محدودیت فقط برای اولین فیلد بکار میره... مطمئن هستید که اون فیلدی که خالی گذاشته بودید، اولین فیلد بوده؟

  7. #7
    PC2st.ir عزیز خیلی ممنون !

    حالا من میخام که قابلیت ویرایش رو از گرید بگیرم و یه دکمه ویرایش واسه هر سطر بزارم , هر وقت
    این دکمه زده سد , مقدار اون ستون ها همون سطری که دکمش زده شده در چند تا تکست باکس نمایش داده بشه و بعد کاربر هر تغییری خواست روش انجام بده و بعد با زدن یک دکمه Update مقدار اون سطر آپدیت بشه !

    با تشکر

  8. #8
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    36
    پست
    1,491
    بهتره که خاصیت SelectionMode از شئ dataGridView1 را روی FullRowSelect تنظیم کنیم. خاصیت ReadOnly از شئ dataGridView1 را روی True تنظیم میکنیم تا نشه توسط کاربر بصورت مستقیم توی dataGridView1 ویرایش صورت بگیره. به تعداد هر فیلد هم یک textBox به فرم اضافه میکنیم.
    بعدش دکمه های btnEdit و btnUpdate رو به فرم اضافه میکنیم. btnEdit برای پر کردن textBoxهای روی فرم (بر اساس رکورد انتخاب شده در dataGridView1) بکار میره و btnUpdate برای ذخیره تغییرات بکار میره.
    در رویداد Click از دکمه btnEdit کدهائی رو مینویسیم که میخوایم تمام textBoxهای روی فرم رو با فیلدهای متناظر در رکورد فعلی از شئ dataGridView1 پر کنیم. مثلا textBox1 باید مقدار داخل فیلد Name از رکورد جاری در dataGridView1 را نمایش دهد، برای پر کردن آن بصورت زیر عمل میکنیم:

    textBox1.Text = dataGridView1.CurrentRow.Cells["Name"].Value.ToString();

    بقیه textBoxها هم مثل بالا پر میکنیم.

    برای رویداد Click از دکمه btnUpdate هم باید کدهائی رو بنویسیم که که مقدار داخل textBoxها رو بگیره و dataGridView1 رو Update کنه. مثلا برای textBox1 که فیلد Name از رکورد جاری رو نمایش میده، میشه بصورت زیر عمل کرد:

    dataGridView1.CurrentRow.Cells["Name"].Value = textBox1.Text;

    دیگه خیلی مختصر شد...!

    البته اگر dataGridView رو به کمک یک bindingSource به یک dataSet وصل کرده باشی، میتونی textBoxهات رو هم متصل (Bind) کنی تا در اینصورت textBoxهات عین خانه های یک dataGridView عمل کنند. یعنی مثلا با کلیک روی یک رکورد از dataGridView، تمام textBoxها مقادیر فیلدهای رکورد توی dataGridView رو توی خودشون نمایش میدن و با تغییر متن توی textBoxها، مقادیر فیلد رکورد توی dataGridView هم عوض میشه.
    مثلا اگر از BindingSource استفاده کردی، برای متصل کردن یکی از textBoxها میشه مثل زیر عمل کرد که فیلد Name از dataGridView1 رو به textBox1 متصل میکنه.

    textBox1.DataBindings.Add(new Binding("Text", table1BindingSource, "Name", true));

    که table1BindingSource همون شئ ائی هست (از نوع bindingSource) که باهاش dataGridView1 رو به dataSet متصل کردید.

  9. #9
    PC2st.ir عزیز من میخام برای هر سطر یه دکمه ویرایش باشه , نه اینکه فقط یه دکمه ویرایش برای همه سطرها .
    چطوری میشه همچین کاری کرد ؟


    با تشکر

  10. #10
    خیلی دوست داشتم کمکتون کنم
    اما بحث پیچیده شده و آدم داخلش گم میشه

  11. #11
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    36
    پست
    1,491
    اگر بخوایم هر سطر که در dataGridView1 نمایش داده میشه، دارای یک دکمه ویرایش باشه، باید به ازای هر سطر یک دکمه ایجاد و آنرا در کنترل dataGridView1 قرار داد. همونطور که خودت هم میدونی برای قرار دادن یک دکمه در dataGridView1 بصورت زیر عمل میکنیم:

    dataGridView1.Controls.Add(btnEdit);

    که btnEdit نام دکمه ای هست که میخوایم به dataGridView1 اضافه بشه. اما دستور فوق فقط یک دکمه رو به dataGridView1 اضافه میکنه. پس بهتره که یک گروه یا به عبارت دیگه یک آرایه ای از دکمه ها رو به کنترل dataGridView1 اضافه کنیم. برای این منظور میتونیم از متد AddRange به شکل زیر استفاده کنیم:

    dataGridView1.Controls.AddRange(btnEdit);

    که btnEdit نام آرایه ای از دکمه هاست که ایجاد کردیم به شکل زیر:

    for(int i = 0; i < btnEdit.Length; i++)
    {
    btnEdit[i] = new Button();
    btnEdit[i].Location = new Point(0, btnEdit[i].Height * i);
    }

    که در کدهای بالا، یک آرایه 5 تائی از دکمه ها ایجاد شده و بعدش توی یک حلقه for، تمام اونها نمونه سازی شده، بعدش موقعیت اونها تنظیم میشه بصورتی که هر دکمه ای پائینتر از دکمه قبلی قرار بگیره.
    حالا که ما این دکمه ها رو اضافه کردیم، باید تنظیمات دیگری هم صورت بگیره:
    در صورتی که روی هر دکمه ای (که به کنترل dataGridView1 اضافه شده) کلیک بشه، فقط باید رکورد متناظر با آن دکمه، قابلیت ویرایش شدن داشته باشه. مثلا اگر من روی دکمه دوم کلیک کردم، باید انتظار داشته باشم که فقط رکورد دوم قابل ویرایش باشه، نه اینکه من روی دکمه دوم کلیک کنم و بتونم رکورد پنجم رو تغییر بدهم! برای این منظور:
    ابتدا بایست کنترل dataGridView1 رو بصورت فقط خواندنی تنظیم کنیم.
    در رویداد Click از هر دکمه، باید کاری کنیم که dataGridView1 از حالت فقط خواندنی بیاد بیرون و فیلد مورد نظر از رکورد، به حالت ویرایش در بیاد (به کمک متد BeginEdit در dataGridView1) و کاربر شروع کنه به تایپ و ویرایشهای لازم! خب، اما اگر کاربر به جای ویرایش رکورد (سطر) به فکرش زد و رفت روی رکورد بعدی! مسلما رکورد بعدی هم میتونه ویرایش بشه چون کنترل dataGridView1 حالت فقط خواندنی نداره! پس باید کاری کنیم که هر وقت کاربر، از اون رکورد خودش رو به رکورد دیگری انتقال داد، دوباره کنترل dataGridView1 قفل بشه و فقط خواندنی باشه، پس باید در رویداد RowLeave از dataGridView1 کاری کنیم که دوباره این کنترل فقط خواندنی بشه، (رویداد RowLeave زمانی رخ میدهد که یک سطر انتخاب یا فعالیت خود را از دست داده و به سطر دیگری انتقال یابد به عبارت دیگه هر وقت که سطر فعلی تغییر کنه، این رویداد رخ میده) پس در رویداد RowLeave کد زیر رو مینویسیم تا کنترل dataGridView1 به حالت فقط خواندنی در بیاد و کاربر پس از تغییر سطر جاری، نتونه محتویاتش رو عوض کنه مگر اینکه روی دکمه ویرایشش کلیک کنه.
    تا اینجا رو فکر کنم مشکلی نباشه، ولی اومدیم و کاربر مورد نظر (این کاربر عجب کارهائی که نمیکنه!) روی اسکرول کلیک کرد و محتویات داخل dataGridView1 رو به سمت پائین اسکرول کنه. خب، یک مشکل ایجاد میشه! اون مشکل اینه که وقتی ما دکمه هامون رو به dataGridView1 اضافه کردیم، هر کدومشون دارای یک مختصات هستند (همون خاصیت Location که قبلا برای هر دکمه تنظیمش کردیم) که این مختصات ، مکان قرار گیری هر دکمه رو با توجه به گوشه چپ و بالای داخل کنترل dataGridView1 مشخص میکنه. و همونطور که متوجه شدید، با اسکرول کردن محتویات dataGridView1، مختصات این دکمه ها هنوز تغییر نکرده، پس اینبار نوبت خودمون هست که دکمه های بعدی که باید نمایش داده بشوند رو مشخص کنیم. (بعبارت دیگه خودمون باید دکمه ها رو اسکرول کنیم و مجبوریم برای این کار، خاصیت Top اونها رو دستکاری کنیم، میتونی از خاصیت های ColumnHeadersHeight و VerticalScrollingOffset استفاده کنی). دقیقا نمیدونم منظورت رو خوب فهمیدم یا خیر، اگر منظورت رو خوب فهمیده بودم بگو تا نحوه اسکرول شدن دکمه ها هم توضیح بدم. اگر که کلا خوب توضیح نداده بودم بگو تا از اول بگم. یا اصلا بگو دقیقا کدومش رو توضیح بدم.

    دوستان هم اگر روش بهتری سراغ دارند، عنوان کنند (مثلا به طریقی که یک دکمه رو بشه بصورت یک خانه (سلول) توی dataGridView1 قرار داد، مثلا خانه ای که بجای نمایش یک متن، یک دکمه را نمایش دهد نه اینکه خودمان یک دکمه اضافه کنیم!)، ...

  12. #12
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    36
    پست
    1,491
    راستی برای تعیین مختصات دکمه ها که دقیقا روی یک سطر قرار بگیرن، مختصات بالای هر دکمه رو به شکل زیر میشه تعیین کرد:

    btnEdit[0].Top = dataGridView1.ColumnHeadersHeight;
    for(int i = 1; i < btnEdit.Length; i++)
    {
    btnEdit[i].Top = btnEdit[i-1].Top + dataGridView1.Rows[i-1].Height;
    }

    مکان سمت چپ هر دکمه هم به شکل زیر:

    for(int i = 0; i < btnEdit.Length; i++)
    {
    btnEdit[i].Left = dataGridView1.RowHeadersWidth;
    }

    که در کد بالا، هر دکمه، در فیلد اول قرار میگیره.

  13. #13
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    36
    پست
    1,491
    ببخشید، ولی پستهای قبلی که فرستادم رو بهتره بیخیال شوید (بهر حال اون هم یک روش بود ولی روشی فاقد اصول درسته برنامه نویسی!!)

    برای اضافه کردن یک دکمه به هر سطر از DataGridView به شکل زیر عمل میکنیم:

    DataGridViewButtonColumn myButton = new DataGridViewButtonColumn();
    myButton.Text = "Edit...";
    dataGridView1.Columns.Add(myButton);

تاپیک های مشابه

  1. ستون gridview و استایل خاص
    نوشته شده توسط hamed_bostan در بخش ASP.NET Web Forms
    پاسخ: 14
    آخرین پست: چهارشنبه 14 مهر 1389, 00:53 صبح
  2. حذف از GridView
    نوشته شده توسط maxpayn2 در بخش ASP.NET Web Forms
    پاسخ: 14
    آخرین پست: سه شنبه 29 مرداد 1387, 10:39 صبح
  3. GridView با گوشه های کمانی (Rounded Gridview Corner)
    نوشته شده توسط maryam_80 در بخش ASP.NET Web Forms
    پاسخ: 9
    آخرین پست: دوشنبه 24 دی 1386, 04:31 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •