PDA

View Full Version : پر کردن ستون دیتاگرید



parvin joon
پنج شنبه 29 شهریور 1386, 14:57 عصر
با سلام
ببخشید من می خواهم مقادیر یکی از ستونهای دیتاگرید ویو به صورت خودکار در هنگام اضافه کردن یک سطر جدید پر بشه به این صورت که این ستون یکی از فیلدهای یک جدول بنام title است واین فیلد (فیلد code) یک فیلد از نوع nvarchar می باشد در هر بار اضافه کردن یک سطر جدید مقدار این فیلد از مقدار قبلی 10000 بیشتر است من از خاصیت AutoIncrement کلاس column استفاده کردم مشکلی که وجود داره اینه که اگر نوع این فیلد رو int قرار بدم کار میکنه ولی من می خوام این فیلد از نوع nvarchar باشه و وقتی نوع فیلد رو nvarchar قرار میدهم error به صورت زیر رو میده
اینم کدهایی که نوشتم
strsql = "select * from title where code like '[1-9][1-9]0000' ";
da = newSqlDataAdapter(strsql, con);
da.Fill(ds, "title1");
dataGridView1.DataSource = ds.Tables["title1"];
int l = dataGridView1.RowCount;
ds.Tables["title1"].Columns[0].AutoIncrement = true;
//برای اولین بار جدول پر شود.
if (l == 1)
{
ds.Tables["title1"].Columns[0].AutoIncrementSeed = 110000;
ds.Tables["title1"].Columns[0].AutoIncrementStep = 10000;
}
else
{

dataGridView1.CurrentCell = dataGridView1.Rows[l - 2].Cells[0];
int w = dataGridView1.CurrentCell.RowIndex;
string v = dataGridView1.Rows[w].Cells[0].Value.ToString();
ds.Tables["title1"].Columns[0].AutoIncrementSeed = Convert.ToInt64(v) + 10000;


لطفا راهنمایی کنید.

PC2st
پنج شنبه 29 شهریور 1386, 17:12 عصر
روی کدام خط ارور میده و متن ارور چیست؟

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

parvin joon
پنج شنبه 29 شهریور 1386, 20:07 عصر
روی کدام خط ارور میده و متن ارور چیست؟

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

با تشکر از شما
من نمیتونم نوع فیلدم رو عوض کنم یعنی باید حتما nvarchar باشه یعنی راه دیگهای وجود نداره اینم متن ارور
Cannot change AutoIncrement of a DataColumn with type 'String' once it has data.
خواهش می کنم اگه راه دیگی برای پرکردن به این صورت است راخنمایی کنید
ممنونم

PC2st
پنج شنبه 29 شهریور 1386, 23:16 عصر
راه حل براش هست... بهتره بجای راه حل زیر، نوع فیلد رو به نوع عددی تغییر بدهید.

برای راه حل باید از رویداد DataTable.TableNewRow استفاده کنید، مثلا:


da = new SqlDataAdapter("SELECT ID, NAME FROM Table1", connection);
dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
dt.TableNewRow += new DataTableNewRowEventHandler(dt_TableNewRow);

به فرض اینکه شیئ connection قبلا تعریف شده و اشیاء da و dt بعنوان یک فیلد در محدوده کلاس تعریف شده اند، کدهای فوق اطلاعات رو از بانک میگیره و dataGridView1 رو به منبع داده dt وصل میکنه و یک handle برای رویداد TableNewRow ایجاد میکنه که برای اینکار از متد dt_TableNewRow استفاده میشه. نحوه پیاده سازی متد dt_TableNewRow رو در زیر میبینید:


void dt_TableNewRow(object sender, DataTableNewRowEventArgs e)
{
e.Row["ID"] = (100 * dt.Rows.Count).ToString();
}

همانطور که متوجه شدید، زمانی که یک رکورد رو به dt بخواید اضافه کنید، متد فوق صدا زده خواهد شد. در این متد، پس از افزودن یک رکورد به فیلد ID آن 100 تا 100 تا اضافه میشه.

در کل نحوه قرار گیری کدها در کلاس Form1 باید شبیه به زیر باشد:


public partial class Form1 : Form
{
SqlConnection connection;
SqlDataAdapter da;
DataTable dt;
public Form1()
{
InitializeComponent();
connection = new SqlConnection("your connection string");
da = new SqlDataAdapter("SELECT ID, NAME FROM Table1", connection);
dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
dt.TableNewRow += new DataTableNewRowEventHandler(dt_TableNewRow);
}
void dt_TableNewRow(object sender, DataTableNewRowEventArgs e)
{
e.Row["ID"] = (100 * dt.Rows.Count).ToString();
}
}

parvin joon
جمعه 30 شهریور 1386, 10:13 صبح
راه حل براش هست... بهتره بجای راه حل زیر، نوع فیلد رو به نوع عددی تغییر بدهید.

برای راه حل باید از رویداد DataTable.TableNewRow استفاده کنید، مثلا:


da = new SqlDataAdapter("SELECT ID, NAME FROM Table1", connection);
dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
dt.TableNewRow += new DataTableNewRowEventHandler(dt_TableNewRow);

به فرض اینکه شیئ connection قبلا تعریف شده و اشیاء da و dt بعنوان یک فیلد در محدوده کلاس تعریف شده اند، کدهای فوق اطلاعات رو از بانک میگیره و dataGridView1 رو به منبع داده dt وصل میکنه و یک handle برای رویداد TableNewRow ایجاد میکنه که برای اینکار از متد dt_TableNewRow استفاده میشه. نحوه پیاده سازی متد dt_TableNewRow رو در زیر میبینید:


void dt_TableNewRow(object sender, DataTableNewRowEventArgs e)
{
e.Row["ID"] = (100 * dt.Rows.Count).ToString();
}

همانطور که متوجه شدید، زمانی که یک رکورد رو به dt بخواید اضافه کنید، متد فوق صدا زده خواهد شد. در این متد، پس از افزودن یک رکورد به فیلد ID آن 100 تا 100 تا اضافه میشه.

در کل نحوه قرار گیری کدها در کلاس Form1 باید شبیه به زیر باشد:


public partial class Form1 : Form
{
SqlConnection connection;
SqlDataAdapter da;
DataTable dt;
public Form1()
{
InitializeComponent();
connection = new SqlConnection("your connection string");
da = new SqlDataAdapter("SELECT ID, NAME FROM Table1", connection);
dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
dt.TableNewRow += new DataTableNewRowEventHandler(dt_TableNewRow);
}
void dt_TableNewRow(object sender, DataTableNewRowEventArgs e)
{
e.Row["ID"] = (100 * dt.Rows.Count).ToString();
}
}



با تشکر از شما
ببخشید من نمی تونم نوع فیلدم رو INT کنم یعنی باید حتما NVARCHAR باشه

PC2st
جمعه 30 شهریور 1386, 15:59 عصر
ببخشید من نمی تونم نوع فیلدم رو INT کنم یعنی باید حتما NVARCHAR باشه
راه حل نوشته شده برای فیلدی از نوع NVARCHAR عمل میکنه.