PDA

View Full Version : مشکل در ویرایش datagridview در LinqToEntities



adameh_bahal
شنبه 09 اسفند 1393, 19:33 عصر
با سلام
من یه دیتاگریدویو دارم که وقتی رو هدر سطراش کلیک بشه اطلاعات اون سطر رو توی تکست باکس ها میریزه و بعد کاربر اطلاعات رو ویرایش میکنه و روی دکمه ادیت کلیک میکنه ولی بعد ادیت فقط همون سطر ادیت شده میمونه و اگه یه سطر دیگه ویرایش بشه اطلاعات سطر ویرایش شده قبلی به مقدار اولش برمیگرده و همیشه فقط یه سطر هست که اطلاعاتش ویرایش شده
این کد دکمه ادیت هست:



var nationalCode = txtSearchNationalCode.Text;

var loan =
_db.loans.FirstOrDefault(
c => c.personnel.p_national_code == nationalCode);

try
{
if(loan !=null)
{
loan.l_date = pdlDate.GregorianDate;
loan.l_value =Convert.ToDecimal(txtValue.Value.Trim());
loan.personnel.p_national_code =txtSearchNationalCode.Text.Trim();

_db.SaveChanges();
MessageBox.Show(Resources.OperationSucceeded);
Utilities.ResetAllControls(groupBox1);
var pc =newPersianCalendar();

var ncode = txtSearchNationalCode.Text;
var loans = _db.loans.Where(c => c.personnel.p_national_code == ncode);

var result = loans.ToList().Select(l =>newLoanGrid
{
l_id = l.l_id,
p_national_code = l.personnel.p_national_code,
p_personnel_num = l.personnel.p_personnel_num,
l_date =
string.Format("{0}/{1}/{2}", pc.GetYear(l.l_date),
pc.GetMonth(l.l_date).ToString(CultureInfo.Invaria ntCulture).Length<2
?"0"+ pc.GetMonth(l.l_date)
: pc.GetMonth(l.l_date).ToString(CultureInfo.Invaria ntCulture),
pc.GetDayOfMonth(l.l_date).ToString(CultureInfo.In variantCulture).Length<2
?"0"+ pc.GetDayOfMonth(l.l_date)
: pc.GetDayOfMonth(l.l_date).ToString(CultureInfo.In variantCulture)),
l_value = l.l_value
}).ToList();
dataGridView1.DataSource= result;

}

else
{
groupBox1.Visible=false;
MessageBox.Show(Resources.NoRecordsFound);
}

}

catch(Exception ex)
{
MessageBox.Show(ex.Message);
}

}

کلا اگه روش ساده تر وب هتری هم برای ویرایش وجود داره ممنون میشم معرفی کنید

SabaSabouhi
شنبه 09 اسفند 1393, 21:21 عصر
با سلام
من یه دیتاگریدویو دارم که وقتی رو هدر سطراش کلیک بشه اطلاعات اون سطر رو توی تکست باکس ها میریزه و بعد کاربر اطلاعات رو ویرایش میکنه و روی دکمه ادیت کلیک میکنه ولی بعد ادیت فقط همون سطر ادیت شده میمونه و اگه یه سطر دیگه ویرایش بشه اطلاعات سطر ویرایش شده قبلی به مقدار اولش برمیگرده و همیشه فقط یه سطر هست که اطلاعاتش ویرایش شده
این کد دکمه ادیت هست:


var nationalCode = txtSearchNationalCode.Text;

var loan =
_db.loans.FirstOrDefault(
c => c.personnel.p_national_code == nationalCode);

try
{
if(loan !=null)
{
loan.l_date = pdlDate.GregorianDate;
loan.l_value =Convert.ToDecimal(txtValue.Value.Trim());
loan.personnel.p_national_code =txtSearchNationalCode.Text.Trim();

_db.SaveChanges();
MessageBox.Show(Resources.OperationSucceeded);
Utilities.ResetAllControls(groupBox1);
var pc =newPersianCalendar();

var ncode = txtSearchNationalCode.Text;
var loans = _db.loans.Where(c => c.personnel.p_national_code == ncode);

var result = loans.ToList().Select(l =>newLoanGrid
{
l_id = l.l_id,
p_national_code = l.personnel.p_national_code,
p_personnel_num = l.personnel.p_personnel_num,
l_date =
string.Format("{0}/{1}/{2}", pc.GetYear(l.l_date),
pc.GetMonth(l.l_date).ToString(CultureInfo.Invaria ntCulture).Length<2
?"0"+ pc.GetMonth(l.l_date)
: pc.GetMonth(l.l_date).ToString(CultureInfo.Invaria ntCulture),
pc.GetDayOfMonth(l.l_date).ToString(CultureInfo.In variantCulture).Length<2
?"0"+ pc.GetDayOfMonth(l.l_date)
: pc.GetDayOfMonth(l.l_date).ToString(CultureInfo.In variantCulture)),
l_value = l.l_value
}).ToList();
dataGridView1.DataSource= result;

}

else
{
groupBox1.Visible=false;
MessageBox.Show(Resources.NoRecordsFound);
}

}

catch(Exception ex)
{
MessageBox.Show(ex.Message);
}

}

کلا اگه روش ساده تر وب هتری هم برای ویرایش وجود داره ممنون میشم معرفی کنید

سلام
نمی‌دونم فقط من نمی‌تونم این متن رو بخونم یا دیگران هم مشکل دارن.

صبا صبوحی

golbafan
شنبه 09 اسفند 1393, 21:27 عصر
کد صحیح:


var nationalCode = txtSearchNationalCode.Text;
var loan = db.loans.FirstOrDefault(c => c.personnel.p_national_code == nationalCode);
try
{
if(loan !=null)
{
loan.l_date = pdlDate.GregorianDate;
loan.l_value =Convert.ToDecimal(txtValue.Value.Trim());
loan.personnel.p_national_code =txtSearchNationalCode.Text.Trim();
_db.SaveChanges();
MessageBox.Show(Resources.OperationSucceeded);
Utilities.ResetAllControls(groupBox1);
var pc =newPersianCalendar();
var ncode = txtSearchNationalCode.Text;
var loans = _db.loans.Where(c => c.personnel.p_national_code == ncode);
var result = loans.ToList().Select(l => newLoanGrid
{
l_id = l.l_id,
p_national_code = l.personnel.p_national_code,
p_personnel_num = l.personnel.p_personnel_num,
l_date = string.Format("{0}/{1}/{2}", pc.GetYear(l.l_date),pc.GetMonth(l.l_date), pc.GetDayOfMonth(l.l_date));


l_value = l.l_value
}
).ToList();
dataGridView1.DataSource= result;
}
else
{
groupBox1.Visible=false;
MessageBox.Show(Resources.NoRecordsFound);
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}

adameh_bahal
شنبه 09 اسفند 1393, 21:29 عصر
سلام ممنون که اطلاع دادید من ویرایش کردم حالا نمیدونم اصلاح شده یا خیر

golbafan
شنبه 09 اسفند 1393, 21:35 عصر
سلام ممنون که اطلاع دادید من ویرایش کردم حالا نمیدونم اصلاح شده یا خیر

درستش کردم براتون

SabaSabouhi
شنبه 09 اسفند 1393, 22:11 عصر
سلام
نمی‌دونم تو WPF کار می‌کنی یا Winform.
و راستش پرسش رو هم خیلی شفاف متوجه نشدم. اما اگه حدس من درست باشه. رکورد اصلاح شده تو دیتابیس درست ثبت شده ولی هنوز اطلاعات قبلی
رو توی گرید می‌بینی.
اگر حدس من درست بوده:
اگه تو winForm هستی دوباره bind کن و اگه تو WPF هستی این کارها رو انجام بده:
1. تو کلاسی که برای نگهداری مقادیر جدول loan گرفتی INotifyPropertyChanged رو پیاده سازی کن.
2. تو تمام Propertyها هنگام Set شدن OnPropertyChanged رو فراخوانی کن
3. بجای List از Observation Collection استفاده کن.
البته تو Wpf هم می‌تونی دوباره Bind کنی، اما این راه قشنگ‌تر و حرفه‌ای تر هست.

صبا صبوحی