PDA

View Full Version : حرفه ای: آپدیت خانه های تغییرکرده در دیتاگرید



saeidmscs
دوشنبه 21 تیر 1389, 10:49 صبح
سلام به همه دوستان
فرض کنید که یک دیتا گرید ویو و دو button داریم.
بعد فشردن اولین button اطلاعات خاصی به دیتاگرید ویو،لود میشه و خونه های اونو پر میکنه.
حالا ما ویرایش خونه های دیتاگرید ویو رو مجاز قرار دادیم.
حالا سوال من اینه که چجوری بعد اینکه کاربر بعضی خونه ها رو ویرایش کرد و button دوم رو زد،فقط همون خونه ها آپدیت بشن؟
از event خاصی باید استفاده بشه؟ یا کار دیگه ای؟
اگه دوستان راهنماییم کنن و احیانا کد خاصی رو نشون بدن،خیلی ممنون میشم:خجالت:

ostovarit
دوشنبه 21 تیر 1389, 11:16 صبح
سلام به همه دوستان
فرض کنید که یک دیتا گرید ویو و دو button داریم.
بعد فشردن اولین button اطلاعات خاصی به دیتاگرید ویو،لود میشه و خونه های اونو پر میکنه.
حالا ما ویرایش خونه های دیتاگرید ویو رو مجاز قرار دادیم.
حالا سوال من اینه که چجوری بعد اینکه کاربر بعضی خونه ها رو ویرایش کرد و button دوم رو زد،فقط همون خونه ها آپدیت بشن؟
از event خاصی باید استفاده بشه؟ یا کار دیگه ای؟
اگه دوستان راهنماییم کنن و احیانا کد خاصی رو نشون بدن،خیلی ممنون میشم:خجالت:

یک زمان این موضوع ساده سوال من هم بود ... و به کمک دوستان سایت برنامه نویس حل شد ... شما باید از کد زیر برای این منظور استفاده کنی :



SqlCommandBuilder scb = new SqlCommandBuilder(da);
da.Update(ds.Tables[0]);

saeidmscs
چهارشنبه 23 تیر 1389, 23:25 عصر
یک زمان این موضوع ساده سوال من هم بود ... و به کمک دوستان سایت برنامه نویس حل شد ... شما باید از کد زیر برای این منظور استفاده کنی :



SqlCommandBuilder scb = new SqlCommandBuilder(da);
da.Update(ds.Tables[0]);

ممنون
اما عزیزم اینقدرها هم ساده نیست.
توجه کن،در ابتدا خونه های جدول پر میشه و بعد قراره کاربر اونارو پر کنه
اگر یه جدول خالی جلومون بود،صحبت شما کاملا صحیح بود اما اینجا اینجوری نیست و این دستورات جدولو آپ دیت نمیکنه

Developer Programmer
چهارشنبه 23 تیر 1389, 23:55 عصر
DataSet TempDataSet = new DataSet();
if ( myDataSet.HasChanges() )
{
this.BindingContext[ myDataSet , "Employees" ].EndCurrentEdit(); //supress it
TempDataSet = myDataSet.GetChanges();
foreach ( DataRow dr in TempDataSet.Tables[ 0 ].Rows ) //validate all new/changed rows step-by-step
if ( dr.RowState != DataRowState.Deleted ) //deleted row has nothing to check!
{
if ( dr[ "Title" ].ToString().Trim() == String.Empty )
{
MessageBox.Show( "ستون عنوان خالی است" );
dr[ "title" ] = "مقداری وارد نشده است";
// dr.RejectChanges(); // Reject only an unwanted row !
}
}
myDataAdapter.Update( TempDataSet.Tables[ 0 ] ); //save changes made to DataSet
myDataSet.AcceptChanges(); // commit changes

saeidmscs
پنج شنبه 24 تیر 1389, 17:40 عصر
نمیشه!نمیشه!نمیشه!:عصبانی++:: عصبانی++: به خدا آپدیت نمیشه!
نمیدونم چرا فقط اینو میدونم که وقتی اطلاعات موجود در دیتابیس رو تو دیتاگرید،لود نمیکنم و دیتا گرید خالیه و بعدش چیزی رو اضافه میکنم،اینا به دیتا بیس اضافه میشن.
اما این به کارم نمیاد:ناراحت:
کاربر باید یه جدولی رو ببینه که قبلا اونو پر کرده و الان میخواد ویرایش کنه.
لطفا کمکم کنید
چند روزه که دارم رو این کار میکنم

Developer Programmer
پنج شنبه 24 تیر 1389, 19:09 عصر
درست و حسابی توضیح بده ببینم چی می خوای. اونقدر پر و خالی کردی نفهمیدم چی میخوای !

saeidmscs
پنج شنبه 24 تیر 1389, 23:49 عصر
درست و حسابی توضیح بده ببینم چی می خوای. اونقدر پر و خالی کردی نفهمیدم چی میخوای !
یه دیتاگرید ویو داریم و دو تا button.
بعد اینکه کاربر اولین button رو زد،اطلاعات خاصی وارد دیتا گرید شده و نمایش داده میشه.
حالا کاربر میتونه یه خونه خاصی رو ویرایش کنه،یا یه ردیف رو حذف کنه یا هرکار دیگه و بعد اینکه button دوم رو زد،همه تغییرات ذخیره شن.
اما چجوری؟؟:متفکر::متفکر:

Developer Programmer
جمعه 25 تیر 1389, 10:34 صبح
خوب پسر خوب TempDataSet = myDataSet.GetChanges(); واسه همینه دیگه. شما دیتاست رو به گرید پاس میدی و بعد با

myDataSet.HasChanges()

می فهمی که تغییرات داشتی یا نه بعد با GetChange تغییرات رو میخونی و داخل TempDataSet میریزی.

حالا با یه حلقه میتونی سطرهای TempDataSet رو مرور کنی. و بفهمی کدوم سطر حذف شده و کدوم سطر ویرایش شده
dr.RowState != DataRowState.Deleted


توضیحی که مایکروسافت داده اینه:


Creates a new DataSet (http://msdn.microsoft.com/en-us/library/system.data.dataset.aspx) that contains a copy of all rows in the original DataSet (http://msdn.microsoft.com/en-us/library/system.data.dataset.aspx) that have pending changes. Relationship constraints can cause additional unchanged rows to be added to the new DataSet (http://msdn.microsoft.com/en-us/library/system.data.dataset.aspx) if the unchanged rows contain primary keys corresponding to foreign keys in the changed rows. The method returns null if there are no rows in the original DataSet (http://msdn.microsoft.com/en-us/library/system.data.dataset.aspx) that have pending changes.
و نمونه پروژه هم اینه

private void DemonstrateMerge()
{
// Create a DataSet with one table, two columns,
// and three rows.
DataSet dataSet = new DataSet("dataSet");
DataTable table = new DataTable("Items");
DataColumn idColumn = new DataColumn("id",
Type.GetType("System.Int32"),"");
idColumn.AutoIncrement=true;
DataColumn itemColumn = new DataColumn("Item",
Type.GetType("System.Int32"),"");

// DataColumn array to set primary key.
DataColumn[] keyColumn= new DataColumn[1];
DataRow row;

// Create variable for temporary DataSet.
DataSet changesDataSet;

// Add RowChanged event handler for the table.
table.RowChanged+=new DataRowChangeEventHandler(
Row_Changed);
dataSet.Tables.Add(table);
table.Columns.Add(idColumn);
table.Columns.Add(itemColumn);

// Set primary key column.
keyColumn[0]= idColumn;
table.PrimaryKey=keyColumn;
// Add ten rows.
for(int i = 0; i <10;i++)
{
row=table.NewRow();
row["Item"]= i;
table.Rows.Add(row);
}
// Accept changes.
dataSet.AcceptChanges();
PrintValues(dataSet, "Original values");

// Change row values.
table.Rows[0]["Item"]= 50;
table.Rows[1]["Item"]= 111;

// Add one row.
row=table.NewRow();
row["Item"]=74;
table.Rows.Add(row);

// Insert code for error checking. Set one row in error.
table.Rows[1].RowError= "over 100";
PrintValues(dataSet, "Modified and New Values");

// If the table has changes or errors,
// create a subset DataSet.
if(dataSet.HasChanges(DataRowState.Modified |
DataRowState.Added)&& dataSet.HasErrors)
{
// Use GetChanges to extract subset.
changesDataSet = dataSet.GetChanges(
DataRowState.Modified|DataRowState.Added);
PrintValues(changesDataSet, "Subset values");

// Insert code to reconcile errors. In this case, reject changes.
foreach(DataTable changesTable in changesDataSet.Tables)
{
if (changesTable.HasErrors)
{
foreach(DataRow changesRow in changesTable.Rows)
{
//Console.WriteLine(changesRow["Item"]);
if((int)changesRow["Item",DataRowVersion.Current ]> 100)
{
changesRow.RejectChanges();
changesRow.ClearErrors();
}
}
}
}
// Add a column to the changesDataSet.
changesDataSet.Tables["Items"].Columns.Add(
new DataColumn("newColumn"));
PrintValues(changesDataSet, "Reconciled subset values");
// Merge changes back to first DataSet.
dataSet.Merge(changesDataSet, false,
System.Data.MissingSchemaAction.Add);
}
PrintValues(dataSet, "Merged Values");
}

private void Row_Changed(object sender, DataRowChangeEventArgs e)
{
Console.WriteLine("Row Changed " + e.Action.ToString()
+ "\table" + e.Row.ItemArray[0]);
}

private void PrintValues(DataSet dataSet, string label)
{
Console.WriteLine(label + "\n");
foreach(DataTable table in dataSet.Tables)
{
Console.WriteLine("TableName: " + table.TableName);
foreach(DataRow row in table.Rows)
{
foreach(DataColumn column in table.Columns)
{
Console.Write("\table " + row[column] );
}
Console.WriteLine();
}
}
}