سلام
ممنونم اگه کسی راهنمایی کنه که مشکل این برنامه چیه ؟
سلام
ممنونم اگه کسی راهنمایی کنه که مشکل این برنامه چیه ؟
لطفا یه نفر کمک کنه
سلام دوست عزیز
الان قراره تو برنامه ای که نوشتین از 0 تا 10000 داخل دیتا تیبل ذخیره بشه و در همین حال پروگرس بار پر شه و وفتی کارش تموم شد پروگرس بار پنهان و اطلاعات نمایش داده شه؟
آره؟
همینطوره آما نمیشه نمی دونم ایراد از چیه ؟
با سلام خدمت شما
شما تو کد بالا فقط کار خودتونو سخت کردین
اگه درست متوجه شده باشم ساده ترین کد برای انجام کار مد نظر شما کد زیره (سمپلم براتون ضمیمه کردم) :
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;
}
}
}
موفق باشین
بایت بایت
آقای صفایی دستتون درد نکنه
اجازه بدین یه سوال داشته باشم
سوال : اینکه اگه بخواهیم اطلاعات رو از یه دیتابیس مثلا اکسس بگریم کجای این کد باید تغییر بدیم
ممنون می شم اگه پاسخ بدین
با سلام مجدد
ابتدا بگم چون من ویندوزم با اکسس مشکل داره با اس کی ال مثال میزنم.
دو راه برای شما وجود داره
اولین راه اینه که کد زیر رو بنویسین,از طریق کد زیر دیگه نیازی نیست همه رکورد ها رو یکی یکی بخونینو تو دیتاگرید قرار بدین خودش اتوماتیک اینکارو براتون انجام میده :
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;
}
}
}
موفق باشین
بایت بایت
ممنون از لطفتون
همینه راه حل دوم رو به اکسس برگردوندم جواب داد
بازم تشکر و به قول خودتون :
موفق باشین
بایت بایت
فقط یه مشکل داره
اینکه پروگرس با همون ابدا وا می استه وادامه نمی ده
کد زیر رو اینطوری بنویسین ببینین درست میشه:
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);
}
}
موفق باشین
بایت بایت
با سلام مجدد
چرا ایراد می ده ببینین :
براتون درستش کردم
موفق باشین
بایت بایت
درست شد خیلی از لطفتون ممنونم
موفق باشید