PDA

View Full Version : سوال: ساخت یک کلاس جدید از نوع Datagridview



pooya1072
چهارشنبه 28 فروردین 1392, 19:27 عصر
سلام دوستان ....
نمی دونم این کاری که می خوام انجام بدم شدنیه یا نه ....
من می خوام کلاسی جدید بسازم که از Datagridview ارث برده باشه . البته تا اینجای کار ساده است .
اما مشکل من
همونطور که می دونید Datagridview یک پروپرتی داره به نام Columns که در سه حالت مقدار میگیره :
1-بدون پارامتر که از نوع DatagridviewColumnCollection هستش
2و3 - با پارمتر Index یا ColumnName که در این دو حالت از نوع DatagridviewColumns هست.

حالا من می خوام توی این کلاس جدید که میسازم در زیر مجموعه خواص و متد های برگشتی از این پروپرتی , یک پروپرتی جدید ایجاد کنم مثلا به نام Equation که از نوع String هست . در نهایت می خوام به شکل زیر بتونم به اون مقدار دهی کنم :

Datagridview1.Columns(0).Equation = "مقدار مورد نظر " ;
اگه ممکنه به این سوال جواب بدید . یک ماهه که دربه در دنبال جوابم ولی هیچ نتیجه ای نمی گیرم .
از استاد دانشگاه میپرسم ... نهایت جوابش اینه : "کار سختیه " !!!!!!!!!!!!!!:متعجب:

plus
چهارشنبه 28 فروردین 1392, 19:47 عصر
شما بایستی یک کلاس ستون جدید بنویسید و اون رو مثل سایر انواع ستون ها (TextBox, Button و ...) به DataGridView اضافه کنید.این کلاس ستون شما در صورت نیاز میتونه از DataGridViewTextBoxColumn یا هر نوع ستون دیگه مشتق بشه و یا اینکه از DataGridViewColumn مشتق بشه.
در صورتی که رفتار مورد نیاز شما برای ستون مورد نظرتون، دقیقا شبیه یکی از انواع موجود مثلا DataGridViewTextBoxColumn هست، شما نیاز به تعریف نوع جدید سلول و کنترل ویرایش (DataGridViewCell و IDataGridViewTextBoxEditingControl) نخواهید داشت، وگرنه برای Custom سازی رفتار سول های ستون مورد نظرتون، نیاز دارین تا این دو کلاس دیگه رو هم با روشی شبیه اونچیزی که برای ستون اعمال میکنید، تعریف کنید.

این مثال در MSDN (http://msdn.microsoft.com/en-us/library/7tas5c80.aspx) یک نمونه از ساخت ستون سفارشی رو گذاشته، البته توی این مثال، نیاز، نمایش کنترل تاریخ در DataGridView بوده که با نیاز شما متفاوت هست، بنابراین شما ممکنه بسته به نیازی که دارین، کار کمتر یا بیشتری داشته باشید، ولی کل موضوع همینه.
دنبالش برین و اگه سوالی داشتین بپرسین اگه فرصت کنم پاسخ میدم.

pooya1072
چهارشنبه 28 فروردین 1392, 20:48 عصر
ممنون دوست عزیز ... بعد از یک ماه شما اولین نفری هستی که متوجه شدید من چی می خوام .
مثال شما رو بررسی کردم ... ولی نمی تونم درک کنم چطور ازش جهت انجام کار مورد نظرم استفاده کنم . توی این مثال داره یک کنترل Calander رو به یکی از سلول ها اضافه می کنه در حالی که من یک مرحله قبل یعنی اضافه کردن یک پروپرتی به Columns مد نظرمه . کاری که من کردم این بود که یک کلاس جدید از نوع DatagridviewColumn به نام MyDatagridviewColumn ایجاد کردم و پروپرتی جدید رو درش تعریف کردم .

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WindowsFormsApplication1
{
class MyDatagridviewColumn : System.Windows.Forms.DataGridViewColumn
{
string equ;
public string Equation
{
get
{
return equ;
}
set
{
equ = value;
}
}
}
}
بعد یک کلاس جدید از نوع Datagridview ایجاد کردم و کلاس Columns جدیدی از نوع MyDatagridviewColumn درش override کردم . بعد این کلاس جدید رو Build کردم و توی برنامه به کار بردم .

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WindowsFormsApplication1
{
class MyDatagridview : System.Windows.Forms.DataGridView
{
MyDatagridviewColumn Col;
public override MyDatagridviewColumn columns
{
get
{
return columns;
}
set
{
columns = value;
}
}
}
}

ولی ظاهرا این روال درستی نبوده و جواب نمیده .چون هیچ ستونی نمی تونم اضافه کنم . اگه ممکنه با کد این مطلب رو برام روشن کنید . خیلی ممنون میشم اگه کمک کنید

plus
چهارشنبه 28 فروردین 1392, 21:47 عصر
معمولا شما وقتی یک ستون جدید اضافه میکنید، سلول جدید و گاهی هم کنترل ویرایش جدید باید تعریف کنید (البته میتونید از اونهایی که موجودن مشتق کنید).
شما اگه هدفتون رو از اضافه کردن Property بگین بهتر میتونم کمکتون کنم

pooya1072
چهارشنبه 28 فروردین 1392, 22:16 عصر
این جدول از طریق یک DataTable به یک جدول اسکیوال متصل می شود . از طریق این دیتاگریدویو اعدادی به جدول دیتابیس منتقل میشود . اما قرار نیست تمام اطلاعات را دستی وارد کنیم . با وارد کردن بعضی از سلول های یک سطر , سلول های دیگر بر اساس فرمولی که بعدا توسط کاربر تعیین میشود و اطلاعات وارد شده در سلول های قبلی پر میشوند . حال من می خواهم برای هر ستون یک خاصیت Equation جهت ورود فرمول مربوطه ایجاد کنم تا با هر بار وارد کردن عددی در سلول های یک ستون این فرمول ها فراخوانی و سلول های مشخص شده در فرمول مقدار دهی شوند . دقیقا چیزی شبیه فرمول نویسی در اکسل که در یک سلول با نوشتن علامت مساوی می توانیم فرمولی را وارد کنیم . قسمت مهم و سخت اینه که باید فرمول ها بعد از اجرای برنامه وارد شوند . در حال حاضر تنها مشکل من همین ساخت پروپرتی Equation است که از نوع string میباشد .

Mahmoud.Afrad
چهارشنبه 28 فروردین 1392, 22:32 عصر
CellTemplate رو در کلاس جدید مشخص کن.

class MyDatagridviewColumn : System.Windows.Forms.DataGridViewColumn
{
string equ;
public string Equation
{
get
{
return equ;
}
set
{
equ = value;
}
}

public MyDatagridviewColumn()
{
this.CellTemplate = new DataGridViewTextBoxCell();
}
}

دیگه نیازی به کلاس MyDatagridview نیست.
یک دیتاگریدویو روی فرم بزار و در سازنده فرم ستون جدید رو به گریدویو اضافه کن:

public FrmMain()
{
InitializeComponent();
MyDatagridviewColumn mdgvc = new MyDatagridviewColumn();
mdgvc.Equation = "مقدار مورد نظر";
dataGridView1.Columns.Add(mdgvc);
}


حتی میتونستی هیچ کدوم از این کارها رو نکنی. کافی بود از همون اول از tag ستون استفاده میکردی به جای تعریف Equation.

plus
چهارشنبه 28 فروردین 1392, 23:17 عصر
این جدول از طریق یک DataTable به یک جدول اسکیوال متصل می شود . از طریق این دیتاگریدویو اعدادی به جدول دیتابیس منتقل میشود . اما قرار نیست تمام اطلاعات را دستی وارد کنیم . با وارد کردن بعضی از سلول های یک سطر , سلول های دیگر بر اساس فرمولی که بعدا توسط کاربر تعیین میشود و اطلاعات وارد شده در سلول های قبلی پر میشوند . حال من می خواهم برای هر ستون یک خاصیت Equation جهت ورود فرمول مربوطه ایجاد کنم تا با هر بار وارد کردن عددی در سلول های یک ستون این فرمول ها فراخوانی و سلول های مشخص شده در فرمول مقدار دهی شوند . دقیقا چیزی شبیه فرمول نویسی در اکسل که در یک سلول با نوشتن علامت مساوی می توانیم فرمولی را وارد کنیم . قسمت مهم و سخت اینه که باید فرمول ها بعد از اجرای برنامه وارد شوند . در حال حاضر تنها مشکل من همین ساخت پروپرتی Equation است که از نوع string میباشد .

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

pooya1072
چهارشنبه 28 فروردین 1392, 23:26 عصر
حتی میتونستی هیچ کدوم از این کارها رو نکنی. کافی بود از همون اول از tag ستون استفاده میکردی به جای تعریف Equation.
با تشکر ... درست میگید ولی مشکل در اینه که equation رو به صورت آرایه لازم دارم ...


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