PDA

View Full Version : مشکل با datagridview



meghdad2006
جمعه 24 بهمن 1393, 00:37 صبح
بسمه تعالی
با سلام
-----------------

من زمانی که دیتاگریدویو رو به صورت زیر با کدنویسی تعریف میکنم، تعداد سطرهای اون رو در messagebox برابر با صفر نشون میده.


DataGridView dgvTemp = new DataGridView();

dgvTemp.DataSource = bank.spSrchEjraMnb();
MessageBox.Show(dgvTemp.rows.count.tostring());


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

sajaaaaad
جمعه 24 بهمن 1393, 01:05 صبح
فک کنم ایراد از کدات باشه، چرا حالا از جعبه ابزار استفاده نمیکنی.؟
بعدشم تعریف فقط همین


DataGridView dgvTemp = new DataGridView();

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


DataGridView dataGridView1 = new DataGridView();
dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeig htSizeMode.AutoSize;
dataGridView1.Location = new System.Drawing.Point(12, 12);
dataGridView1.Name = "dataGridView1";
dataGridView1.Size = new System.Drawing.Size(388, 160);
dataGridView1.TabIndex = 0;
this.Controls.Add(dataGridView1);

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

mrprestige
جمعه 24 بهمن 1393, 10:49 صبح
بسمه تعالی
با سلام
-----------------

من زمانی که دیتاگریدویو رو به صورت زیر با کدنویسی تعریف میکنم، تعداد سطرهای اون رو در messagebox برابر با صفر نشون میده.


DataGridView dgvTemp = new DataGridView();

dgvTemp.DataSource = bank.spSrchEjraMnb();
MessageBox.Show(dgvTemp.rows.count.tostring());


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

سلام دوست گرامی شما داخل مسیج باکس اونجایی که نوشتی rows.count بنویس ()dgvTemp.Rowcount.tostring .
موفق باشید.

meghdad2006
جمعه 24 بهمن 1393, 12:23 عصر
بسمه تعالی
باعرض سلام
---------------------

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


DataGridView dgvTemp = new DataGridView();

dgvTemp.DataSource = bank.spSrchEjraMnb();
MessageBox.Show(dgvTemp.RowCount.ToString());
foreach (DataGridViewRow dr in dgvTemp.Rows)
{
MessageBox.Show(dr.Cells[1].Value.ToString());
}

اما تعدا سطرها رو صفر نشون میده و درنتیجه حلقه foreach هم اجرا نمیشه.
اما زمانی که دیتاگرید ویو رو از toolbox روی فرم قرار میدم، تعداد سطرها رو درست نشون میده و foreach هم اجرا میشه.
میشه بگید مشکل از کجاست؟ یا اینکه به جای دیتاگریدویو که نمیخوام نشون هم داده بشه روی فرم، از چه چیزی استفاده کنم؟

-----------------
با تشکر

محمد رضا فاتحی
جمعه 24 بهمن 1393, 12:55 عصر
سلام می تونی از datatable استفاده کنی
بعد از اینکه اطلاعات داخل بانکت رو به دیتاتیبل پاس دادی یا همون(FILL) می تونی از هر سطرش استفاده کنی
for (int i = 0; i < dt.Rows.Count; i++) {
string id = dt.Rows[i].ItemArray[0].ToString();
}

meghdad2006
جمعه 24 بهمن 1393, 15:39 عصر
تشکر.راه خوبیه.
اما من با استفاده از linq با دو خط زیر اطلاعات رو بدست میارم.

linqdcDataContext bank = new linqdcDataContext();
dgvTemp.DataSource=bank.spSrchOrg();

آیا دیتاتیبل هم میشه به همین راحتی پر کرد؟ یا موردی که بشه به همین راحتی اطلاعات رو درون اون ریخت و بدست آورد؟

محمد رضا فاتحی
شنبه 25 بهمن 1393, 09:29 صبح
من خودم با همون روشهای سنتی پر می کنم مشکلی هم نیست(البته تو کلاس نوشتم خط کد اضافه نمی نویسم) با linq کار نکردم نمی دونم چطوریه!!:افسرده:

khokhan
شنبه 25 بهمن 1393, 15:53 عصر
بسمه تعالی
باعرض سلام
---------------------

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


اما تعدا سطرها رو صفر نشون میده و درنتیجه حلقه foreach هم اجرا نمیشه.
اما زمانی که دیتاگرید ویو رو از toolbox روی فرم قرار میدم، تعداد سطرها رو درست نشون میده و foreach هم اجرا میشه.
میشه بگید مشکل از کجاست؟ یا اینکه به جای دیتاگریدویو که نمیخوام نشون هم داده بشه روی فرم، از چه چیزی استفاده کنم؟

-----------------
با تشکر

وقتی قراره که دیتا گرید به صورت دینامیک ایجاد بشه پس بایستی رویدادها رو هم خودتون اضافه کنین


public partial class Form1 : Form
{
DataClasses1DataContext db = new DataClasses1DataContext();
DataGridView DGV1;
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
DGV1 = new DataGridView();

var search = from s in db.tbl1s
orderby s.Country descending
select s;

//تنظیمات
DGV1.AllowUserToDeleteRows = false;
DGV1.ReadOnly = true;
//DGV1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
DGV1.MultiSelect = false;
DGV1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;
DGV1.AllowUserToResizeColumns = false;
DGV1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableRes izing;
DGV1.AllowUserToResizeRows = false;
DGV1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizin g;
DGV1.AutoGenerateColumns = false;
//ستونهای گرید
DGV1.ColumnCount = 3;
DGV1.Columns[0].HeaderText = "شناسه";
DGV1.Columns[0].DataPropertyName = "CustomerID";
DGV1.Columns[1].HeaderText = "نام اعضا";
DGV1.Columns[1].DataPropertyName = "ContactName";
DGV1.Columns[2].HeaderText = "نام شهر";
DGV1.Columns[2].DataPropertyName = "City";
//موقعیت و اندازه گرید
DGV1.DataSource = search.ToList();
DGV1.Location = new Point(50, 50);
DGV1.Size = new System.Drawing.Size(500,200);
DGV1.RightToLeft = RightToLeft.Yes;
DGV1.CellClick += new DataGridViewCellEventHandler(DGV1_CellClick);
//افزودن گرید در فرم
this.Controls.Add(DGV1);
}
private void DGV1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (DGV1.SelectedRows.Count >=1)
{
MessageBox.Show(DGV1.SelectedRows[0].Cells[1].Value.ToString() + " " + DGV1.SelectedRows[0].Cells[2].Value.ToString());
}
}
}

128456

meghdad2006
شنبه 25 بهمن 1393, 16:12 عصر
وقتی قراره که دیتا گرید به صورت دینامیک ایجاد بشه پس بایستی رویدادها رو هم خودتون اضافه کنین


public partial class Form1 : Form
{
DataClasses1DataContext db = new DataClasses1DataContext();
DataGridView DGV1;
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
DGV1 = new DataGridView();

var search = from s in db.tbl1s
orderby s.Country descending
select s;

//تنظیمات
DGV1.AllowUserToDeleteRows = false;
DGV1.ReadOnly = true;
//DGV1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
DGV1.MultiSelect = false;
DGV1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;
DGV1.AllowUserToResizeColumns = false;
DGV1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableRes izing;
DGV1.AllowUserToResizeRows = false;
DGV1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizin g;
DGV1.AutoGenerateColumns = false;
//ستونهای گرید
DGV1.ColumnCount = 3;
DGV1.Columns[0].HeaderText = "شناسه";
DGV1.Columns[0].DataPropertyName = "CustomerID";
DGV1.Columns[1].HeaderText = "نام اعضا";
DGV1.Columns[1].DataPropertyName = "ContactName";
DGV1.Columns[2].HeaderText = "نام شهر";
DGV1.Columns[2].DataPropertyName = "City";
//موقعیت و اندازه گرید
DGV1.DataSource = search.ToList();
DGV1.Location = new Point(50, 50);
DGV1.Size = new System.Drawing.Size(500,200);
DGV1.RightToLeft = RightToLeft.Yes;
DGV1.CellClick += new DataGridViewCellEventHandler(DGV1_CellClick);
//افزودن گرید در فرم
this.Controls.Add(DGV1);
}
private void DGV1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (DGV1.SelectedRows.Count >=1)
{
MessageBox.Show(DGV1.SelectedRows[0].Cells[1].Value.ToString() + " " + DGV1.SelectedRows[0].Cells[2].Value.ToString());
}
}
}

128456

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

meghdad2006
شنبه 25 بهمن 1393, 16:16 عصر
مشکل من اینه که زمانیکه دیتاگرید ویو رو از تول باکس میارم، datasource اونو برابر با یک تیبل قرار می دم، تعداد سطرهای فراخوانده شده به آن رو درست نشون میده.
اما هنگامی که با کد اونو تعریف می کنم و datasource اونو برابر با همون تیبل قرار می دم، تعداد سطرها رو صفر میزنه !!!!!!!!

محمد رضا فاتحی
شنبه 25 بهمن 1393, 17:46 عصر
نگاه کن دوست عزیزم منم اوایل کارم تقریبا همینکار رو می کردم اگه فقط می خوای یه واسط باشه و نمایش داده نشه خوب مخفیش کن دیگه این همه درد سر نداره که!!!

khokhan
شنبه 25 بهمن 1393, 21:20 عصر
ممنون از پاسخ شما.
اما فکر می کنم اکثر این مراحلی که شما نوشتید لازم نباشه. چون من که نمیخوام دیتاگرید ویو رو روی فرم به نمایش در بیارم. فقط به عنوان با بین بانک ، که بتونم اطلاعات واکشی شده از بانک رو توی اون داشته باشم برای اینکه بتونم با یک حلقه بین سطرهای اون جابجا شم. همین.
به همین دلیله که گفتم اگه کنترل بهتری (مثلا دیتاتیبل، گرید ویو، ...) وجود داره که متد source. داشته باشه هم برای من کفایت می کنه
خب اگه اینطوره پس دیگه لازم نیس گرید بکار ببری
یه دونه کمبوباکس روبراساس یکی از فیلدها پر می کنی و در رویداد SelectedIndexChanged کمبو سایر فیلدها رو براساس فیلد متناظر کمبو توی مسیج باکس نمایش می دی

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedIndex >=0)
{
var search = from s in db.tbl1s
where s.ContactName == comboBox1.Text
select s;
foreach (var item in search)
{
MessageBox.Show("نام کشور" + ":" + " " + item.Country + "\r" + "نام شهر" + ":" + " " + item.City, "",
MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1,
MessageBoxOptions.RightAlign | MessageBoxOptions.RtlReading);

}
}
}
128467