PDA

View Full Version : سوال: مشکل با ایجاد ردیف در datagridview



mahtab.kamali
جمعه 29 دی 1391, 17:48 عصر
سلام

ممنونم اگه کسی راهنمایی کنه که مشکل این برنامه چیه ؟

mahtab.kamali
جمعه 29 دی 1391, 20:03 عصر
لطفا یه نفر کمک کنه :عصبانی++:

Y_Safaiee
جمعه 29 دی 1391, 20:09 عصر
سلام دوست عزیز

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

آره؟

mahtab.kamali
جمعه 29 دی 1391, 20:12 عصر
همینطوره آما نمیشه نمی دونم ایراد از چیه ؟

Y_Safaiee
جمعه 29 دی 1391, 20:24 عصر
با سلام خدمت شما

شما تو کد بالا فقط کار خودتونو سخت کردین

اگه درست متوجه شده باشم ساده ترین کد برای انجام کار مد نظر شما کد زیره (سمپلم براتون ضمیمه کردم) :



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
DataTable dt = new DataTable();
public Form1()
{
InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
dt.Columns.Add("A");
dt.Columns.Add("B");
dt.Columns.Add("C");
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
progressBar1.Visible = true ;
for (int a = 0; a <= 10000; a++)
{
dt.Rows.Add();
dt.Rows[a]["A"] = a.ToString();
dt.Rows[a]["B"] = a.ToString();
dt.Rows[a]["C"] = a.ToString();
int p = a / 10000 * 100;
backgroundWorker1.ReportProgress(p);
}

}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{

dataGridView1.DataSource = dt;

}

private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
}
}



موفق باشین
بایت بایت

mahtab.kamali
جمعه 29 دی 1391, 20:34 عصر
آقای صفایی دستتون درد نکنه

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

Y_Safaiee
جمعه 29 دی 1391, 21:05 عصر
با سلام مجدد

ابتدا بگم چون من ویندوزم با اکسس مشکل داره با اس کی ال مثال میزنم.

دو راه برای شما وجود داره

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



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace LoadData
{
public partial class Form1 : Form
{
SqlConnection cnn=new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\Database1.mdf;Integrated Security=True;User Instance=True");
SqlDataAdapter da;
DataTable dt = new DataTable();
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
da = new SqlDataAdapter("Select * from users", cnn);
da.Fill(dt);
dataGridView1.DataSource = dt;
}
}
}



راه دوم اینه که سطر به سطر از دیتاگرید بخونین و بعد از اتمام خوندن به دیتاگرید نسبت بدین اینطوری :



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace LoadData
{
public partial class Form1 : Form
{
SqlConnection cnn=new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\Database1.mdf;Integrated Security=True;User Instance=True");
SqlDataAdapter da;
DataTable dt = new DataTable();
DataTable dt2 = new DataTable();
public Form1()
{
Control.CheckForIllegalCrossThreadCalls = false;
InitializeComponent();
}

private void button2_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
da = new SqlDataAdapter("Select * from users", cnn);
da.Fill(dt);

dt2.Columns.Add("ID");
dt2.Columns.Add("Name");
dt2.Columns.Add("Family");

for (int a = 0; a < dt.Rows.Count; a++)
{
dt2.Rows.Add();
dt2.Rows[a]["ID"] = dt.Rows[a]["ID"];
dt2.Rows[a]["Name"] = dt.Rows[a]["Name"];
dt2.Rows[a]["Family"] = dt.Rows[a]["Family"];

int p = a+1 / dt.Rows.Count * 100;
backgroundWorker1.ReportProgress(p);
}

}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
dataGridView2.DataSource = dt2;
}
}
}



موفق باشین
بایت بایت

mahtab.kamali
جمعه 29 دی 1391, 21:12 عصر
ممنون از لطفتون
همینه راه حل دوم رو به اکسس برگردوندم جواب داد :تشویق:

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

mahtab.kamali
جمعه 29 دی 1391, 21:19 عصر
فقط یه مشکل داره

اینکه پروگرس با همون ابدا وا می استه وادامه نمی ده

Y_Safaiee
جمعه 29 دی 1391, 21:26 عصر
کد زیر رو اینطوری بنویسین ببینین درست میشه:



int p = (a + 1) / dt.Rows.Count * 100;
backgroundWorker1.ReportProgress(p);


در ضمن برای رفع باگ(وقتی دوباره اطلاعات فراخوانی شن ارور میده و میگه این ستون ها وجود داره و ... , کد زیر رو اینطوری بتویسین :



private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
dt.Clear();
dt2.Columns.Clear();
dt2.Rows.Clear();

da = new SqlDataAdapter("Select * from users", cnn);
da.Fill(dt);


dt2.Columns.Add("ID");
dt2.Columns.Add("Name");
dt2.Columns.Add("Family");

for (int a = 0; a < dt.Rows.Count; a++)
{
dt2.Rows.Add();
dt2.Rows[a]["ID"] = dt.Rows[a]["ID"];
dt2.Rows[a]["Name"] = dt.Rows[a]["Name"];
dt2.Rows[a]["Family"] = dt.Rows[a]["Family"];

int p = (a + 1) / dt.Rows.Count * 100;
backgroundWorker1.ReportProgress(p);
}

}


موفق باشین
بایت بایت

mahtab.kamali
جمعه 29 دی 1391, 21:38 عصر
با سلام مجدد

چرا ایراد می ده ببینین :

Y_Safaiee
جمعه 29 دی 1391, 21:51 عصر
براتون درستش کردم

موفق باشین
بایت بایت

mahtab.kamali
جمعه 29 دی 1391, 22:07 عصر
درست شد خیلی از لطفتون ممنونم :تشویق:

موفق باشید