PDA

View Full Version : رفرش کردن datagridview پس از درج اطلاعات و عدم نمایش اطلاعات قبلی



sahel65
شنبه 21 خرداد 1390, 12:48 عصر
سلام دوستان؛
این کدی ست که من برای درج اطلاعات توی datagridview نوشتم:



private void button1_Click(object sender, EventArgs e)
{
connect();
cmd.CommandText = "select * from person";
cmd.Connection = cnn;
sda.SelectCommand = cmd;
cnn.Open();
sda.Fill(ds, "person");
dataGridView1.DataSource = ds;
dataGridView1.DataMember = "person";
cnn.Close();
}


حالا اگه بخوام کاربر هر دفعه که اطلاعات جدیدی رو وارد کرد و این دکمه رو زد مجددا و بدون نمایش دادن سطرهای قبلی اینکار رو انجام بده چه کاری باید بکنم؟؟ یعنی منظورم اینه که اگه 10 تا رکورد دارم و کاربر یکی دیگه وارد کرد و این دکمه زد 11 تا نشون بده نه اینکه 21(در این حالت اونهای قبلی رو هم توی خودش نگه داره)!

ایمان مدائنی
شنبه 21 خرداد 1390, 13:42 عصر
شما دوباره كوئري رو ران كن
دليلي نيست بشه 21
كوئري همون ركوردهايي كه مي خواهي رو بر ميگردونه

gwbasic
شنبه 21 خرداد 1390, 17:51 عصر
کدی که نوشتین درسته و آنچه در Person وجود داره رو میاره. مشکل تو کدی هست که رکورد ها رو ذخیره می کنید

Directx
شنبه 21 خرداد 1390, 18:08 عصر
دوست عزیز به احتمال 90 درصد (شایدم بیشتر:لبخند:) شما دیتاست رو clear نکردین یعنی هر وقت که کوئری رو اجرا می کنید دیتاست رو clear کنید و بعد دوباره پر کنید یا دیتاست جدید بسازید

B.I.O.H.A.Z.A.R.D
شنبه 21 خرداد 1390, 18:45 عصر
دستورتون رو به این صورت تغییر بدید، شاید درست بشه.

private void button1_Click(object sender, EventArgs e)
{
connect();
cmd.CommandText = "select * from person";
cmd.Connection = cnn;
sda.SelectCommand = cmd;
cnn.Open();
sda.Fill(ds, "person");
personBindingSource.DataSource = ds;
cnn.Close();
}

در مورد اینکه وقتی 10 تا رکورد داریم، یکی دیگه اضافه بشه، و این دکمه زده بشه، 11 تا باید نشون بده یا یکی؟ اینو واضح نگفتید. راهنماییم در این مورد اینه که باید با دستور select به این نتیجه برسید. حالا شما توضیح بدید من میگم چطوری :چشمک:

sahel65
یک شنبه 22 خرداد 1390, 08:24 صبح
دوستان عزیز از همتون ممنون و متشکرم.
با راهنمایی دوست خوبمون Directx مشکل حل شد، من clear نکرده بودم.
اما دوست عزیز کد شما B.I.O.H.A.Z.A.R.D کار نکرد!
ببنید منظورم اینه که وقتی کاربر مقادیر مورد نظر رو وارد کرد علاوه بر مقادیر قبلی با زدن کلید show این یکی رو هم به انتها اضافه کنه، یعنی نیاد دوباره گرید رو علاوه بر مقادیر قبلی که داشته دوباره همونا رو به اضافه مقادیر جدید پر کنه! ببخشید اگه منظورم واضح نبود.
حالا یه سوال دیگه برام پیش اومد.
من اگه بخوام کاربر بعد از وارد کردن مقادیر مورد نظرش بتونه بدون اینکه برنامه رو دوباره اجرا کنه وارد کنه چیکار باید بکنم؟
طبق تصویر من به محض اینکه کاربر مقادیر رو وارد کرد و پیغام "اطلاعات در بانک ثبت شد" اومدم و textbox ها رو خالی کردم، ولی وقتی که دوباره وارد می کنم خطای زیر رو مبنی بر duplicate بودن میده!
ممنون میشم ازتون!


71050

R_Rajaee_Rad
یک شنبه 22 خرداد 1390, 08:28 صبح
حتما فیلد کلید اصلی را دوبار داره ذخیره میشه
در ضمن اونجوری که شما میخواین دیتاگرید رو رفرش کنید طرز درستی نیست
باعث کندی برنامه میشه

sahel65
یک شنبه 22 خرداد 1390, 08:32 صبح
نه کلید اصلی اصلا براش تعریف نکردم،
چیکار کنم که کند نشه؟

Directx
یک شنبه 22 خرداد 1390, 10:45 صبح
تو کد شما ظاهرا هیچ مشکلی وجود نداره اون تابع connect چیکار می کنه؟ در ضمن مثلا اگه شما صد تا رکورد داشته باشید اینکه دوباره گرید رو رفرش کنید کار زیاد جالبی نیست به نظر من بهتره که بعد از مطمئن شدن از اینکه insert تو دیتابیس به درستی انجام شده سطر رو به صورت دستی خودتون وارد کنید مثلا اینجوری

private void button1_Click(object sender, EventArgs e)
{
dataGridView1.Rows.Add("مقدار فیلد 1", "مقدار فیلد2",...);
}


برای مطمئن شدن می تونید متد ExecuteNonQuery رو تو یه شرط بذارید یعنی این متد اگه روی هیچ سطری تاثیر نذاره مقدار 1- رو برمی گردونه

sahel65
یک شنبه 22 خرداد 1390, 11:00 صبح
دوست عزیزم ازتون خیلی ممنونم؛
ببینید من کد رو به صورت کامل براتون میذارم،
ببنید اون قسمتی رو که گفتید درست گذاشتم؟ آخه ایراد می گرفت.(البته میدونم ایراد از منه)
ضمنا به الگوریتم خیلی جالبی اشاره کردید، در خصوص گذاشتن یه شرط برای درج. میشه بگید کجا اگه بذارم بهتره؟ یک کلاس برای اینکار تعریف کنم یا نه؟ ممنون میشم اگه راهنماییم کنید.


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

namespace WindowsFormsApplication7
{

public partial class Form1 : Form
{
SqlConnection cnn = new SqlConnection();
SqlCommand cmd = new SqlCommand();
SqlDataAdapter sda = new SqlDataAdapter();
DataSet ds = new DataSet();

public void connect()
{
cnn.ConnectionString=@"Data Source=SCCO\STAR;Initial Catalog=test;Integrated Security=True";
cnn.Close();
}

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

this.personTableAdapter.Fill(this.testDataSet.pers on);

}

private void button1_Click(object sender, EventArgs e)
{
ds.Clear();
connect();
cmd.CommandText = "select * from person";
cmd.Connection = cnn;
sda.SelectCommand = cmd;
cnn.Open();
sda.Fill(ds, "person");
dataGridView1.Rows.Add("@id", textBox1.Text, "@name",textBox2.Text);//سطری که شما گفته بودی اضافه کردم
// dataGridView1.DataSource = ds;
dataGridView1.DataMember = "person";
cnn.Close();

}

private void button1_Click_1(object sender, EventArgs e)
{

connect();
cnn.Open();
cmd.CommandText = "insert into person "+"(id,name)"+ "VALUES (@id,@name)";
cmd.Parameters.AddWithValue("@id", textBox1.Text);

cmd.Parameters.AddWithValue("@name",textBox2.Text);
cmd.Connection = cnn;
cmd.ExecuteNonQuery();

MessageBox.Show("Your Information success in Bank");
textBox1.Clear();
textBox2.Clear();
cnn.Close();
}
}
}