PDA

View Full Version : سوال: سورت شماره ردیف جداول



neda_dela
پنج شنبه 16 دی 1389, 23:52 عصر
سلام دوستان
من توی فیلدهای بانکم فیلد ردیف هم دارم حالا بعد از حذف یک رکورد مثلا با شماره ردیف 3 شماره ردیف ها سورت نمیشه و 1 و 2 و 4 و ... می مونه . حالا من میخام طوری بشه که با حذف رکورد شماره ردیف سورت بشه
البته باید از کمک های csharpprogrammer که واقعا خیلی کمکم کردن بسیار تشکر کنم
این کدهایی رو هم میذارم ایشون من رو راهنمایی کردن حالا دوستان این کد تا حدودی کار می کنه مثلا بعد از انتخاب یه رکورد و حذف اون درست کار می کنه اما با انتخاب چند رکورد و حذف اونها درست عمل نمیشه
لطفا دوستان من رو کمک کنین


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 dg_chb_del
{
publicpartialclass Form1 : Form
{
List<string> lstid = newList<string>(); // جهت نگهداری آی دی هایی که کاربر آنها را تیک زده
SqlDataReader dr;
SqlDataAdapter da;
SqlConnection con;
SqlCommand cmd;
DataSet ds;
BindingSource bs;
public Form1()
{
InitializeComponent();
da = new SqlDataAdapter();
con = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=db_tel;Integrated Security=True");
cmd = new SqlCommand();
ds = new DataSet();
bs = new BindingSource();
}

privatevoid Form1_Load(object sender, EventArgs e)
{
da = new SqlDataAdapter("select * from tbl_sabt", con);
da.Fill(ds, "tbl_sabt");
bs.DataSource = ds.Tables["tbl_sabt"];
dataGridView1.DataSource = bs;
dataGridView1.Rows[0].ReadOnly = true;
}
privatevoid button1_Click(object sender, EventArgs e)// بعد از تیک زدن رکوردهای مورد نظر باید دکمه تایید زده شود تا آی رکورد درون لیست قرار گیرد
{
lstid.Clear();
for (int Count = 0; Count < dataGridView1.RowCount; Count++)
{
Boolean Checkedid = Convert.ToBoolean(dataGridView1.Rows[Count].Cells["chbox"].Value);
if (Checkedid)
{
lstid.Add(dataGridView1.Rows[Count].Cells[1].Value.ToString());
}
}
}
privatevoid button2_Click(object sender, EventArgs e)
{
if (DialogResult.Yes == MessageBox.Show("آیا می خواهید این رکورد را حذف کنید", "اخطار", MessageBoxButtons.YesNo))
{

for (int i = 0; i < lstid.Count(); i++)
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
string str1 = "delete from tbl_sabt where id="+lstid[i]+"";
cmd.Connection = con;
cmd.CommandText = str1;
cmd.ExecuteNonQuery();
con.Close();
dataGridView1.Refresh();
dataGridView1.Rows.Remove(dataGridView1.CurrentRow );
}
for (int i =int.Parse(lstid[0]); i <=dataGridView1.Rows.Count; i++)
{
int temp = i + 1 - 1;
int temp1 = i + 1;
if (con.State == ConnectionState.Closed)
{
con.Open();
}
cmd.Connection = con;
cmd.CommandText = "update tbl_sabt set id='" + temp + "' where id=" + temp1;
cmd.ExecuteReader();
con.Close();
dataGridView1.Refresh();
}
}
}
}
}

ali.rezaei7
جمعه 17 دی 1389, 04:34 صبح
ندا برداشت من از نوشته هات این بود که شما می خوای بعد از حذف کردن رکوردها ترتیب، شماره ردیف ها بهم نریزه. یعنی توالی 1و2و3و4و... پابرجا باشه.
من کد شما رو اصلاح کردم و این شکلی شد:


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 dg_chb_del
{
publicpartialclass Form1 : Form
{

SqlDataReader dr;
SqlDataAdapter da;
SqlConnection con;
SqlCommand cmd;
DataSet ds;
BindingSource bs;
public Form1()
{
InitializeComponent();
da = new SqlDataAdapter();
con = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=db_tel;Integrated Security=True");
cmd = new SqlCommand();
ds = new DataSet();
bs = new BindingSource();
}

privatevoid Form1_Load(object sender, EventArgs e)
{
da = new SqlDataAdapter("SELECT * FROM tbl_sabt", con);
da.Fill(ds, "tbl_sabt");
bs.DataSource = ds.Tables["tbl_sabt"];
dataGridView1.DataSource = bs;
dataGridView1.Rows[0].ReadOnly = true;
}

privatevoid button2_Click(object sender, EventArgs e)
{
if (DialogResult.Yes == MessageBox.Show("آيا مي خواهيد اين رکورد را حذف کنيد", "اخطار", MessageBoxButtons.YesNo))
{

cmd.Connection = con;
con.Open();
for (int i = 0; i < dataGridView1.RowCount; i++)
{
Boolean Checkedid = Convert.ToBoolean(dataGridView1.Rows[i].Cells["chbox"].Value);
if (Checkedid)
{

string id=dataGridView1.Rows[i].Cells["id"].Value.ToString();

cmd.CommandText = "DELETE FROM tbl_sabt WHERE id="+id;
cmd.ExecuteNonQuery();
cmd.CommandText = "UPDATE tbl_sabt SET id=id-1 WHERE id>" + id;
cmd.ExecuteNonQuery();
}

}
Form1_Load(null, null);
con.Close();
}
}
}
}
در این کد قبل از حذف کردن رکورد، شماره ردیف رو داخل متغیر id نگه داشتم، تا بعد از اینکه رکورد مورد نظر رو پاک شد، رکورد هایی که شماره ردیف بزرگتری نسبت به رکورد حذف شده داشتند، به اندازه یک مقدار ازشون کم شه.کد زیر این کارو انجام میده.


cmd.CommandText = "UPDATE tbl_sabt SET id=id-1 WHERE id>" + id;
cmd.ExecuteNonQuery();پس دیگه لزومی نداره که از List استفاده کنی.و بخاطر همین رویداد باتن یک حذف شده.

در آخرهم برای نوسازی گیرید ویو، رویداد FORM1_LOAD رو مجدد فرخوانی کردم.

neda_dela
جمعه 17 دی 1389, 23:41 عصر
متشکرم دوست عزیز
شما منظور منو درست متوجه شدی
من هنوز کد شما رو بررسی نکردم ولی یه نکته اونم اینکه شاید من از بین 10 تا رکورد با شماره های از 1 تا 10 من مثلا بخام چند تا رکورد رو با هم تیک بزنم و با هم حذف کنم مثلا رکوردهای 2 و 4 و9
اینطوری بازم عمل می کنه؟

ali.rezaei7
شنبه 18 دی 1389, 08:02 صبح
بله این کارو براتون انجام می ده. من فقط برای اینکه این اتفاق بیفته، کد رو تغییر دادم. البته یه مقدار هم کدتون بهینه تر شده.