PDA

View Full Version : خطای Object cannot be cast from DBNull to other types



Iman7228
جمعه 19 آبان 1396, 23:16 عصر
سلام دوستان.
من این کد رو در برنامه استفاده کردم و روی خط 20، خطای Object cannot be cast from DBNull to other types میدده.نه مقدار null تو دیتابیس دارم و Boolean.
لطفا راهنمایی کنید.ممنون

private void BindGrid()
{
//پر کردن دیتاگرید
DataTable DT = new DataTable();
SqlDataAdapter DAL1 = new SqlDataAdapter("SELECT * from tbl1", scn);
SqlDataAdapter DAL2 = new SqlDataAdapter("SELECT * from tbl2", scn);
DAL2.Fill(DT);
DAL1.Fill(DT);
dataGridView1.DataSource = DT;
BindingSource1.DataSource = DT;


}
private void sumdvg()
{
// عملیات جمع برای دو ستون دیتاگرید
int sumb = new int();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (Convert.ToBoolean(this.dataGridView1.Rows[0].Cells[4].Value) == false) //خطا در این خط اتفاق می افتد
{
sumb += Convert.ToInt32(row.Cells["cell4"].Value);
lblb.Text = sumb.ToString("n0");
}
}
int sumd = new int();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (Convert.ToBoolean(this.dataGridView1.Rows[0].Cells[5].Value) == true)
{
sumd += Convert.ToInt32(row.Cells["cell5"].Value);
}
}
lbld.Text = sumd.ToString("n0");


}

private void txtb_SelectedValueChanged(object sender, EventArgs e)
{
BindGrid();


BindingSource1.Filter = string.Format("bnk LIKE '%{0}%'", txtb.Text);
sumdvg();
}

jafarpalideh
شنبه 20 آبان 1396, 08:30 صبح
سلام دوستان.
من این کد رو در برنامه استفاده کردم و روی خط 20، خطای Object cannot be cast from DBNull to other types میدده.نه مقدار null تو دیتابیس دارم و Boolean.
لطفا راهنمایی کنید.ممنون

private void BindGrid()
{
//پر کردن دیتاگرید
DataTable DT = new DataTable();
SqlDataAdapter DAL1 = new SqlDataAdapter("SELECT * from tbl1", scn);
SqlDataAdapter DAL2 = new SqlDataAdapter("SELECT * from tbl2", scn);
DAL2.Fill(DT);
DAL1.Fill(DT);
dataGridView1.DataSource = DT;
BindingSource1.DataSource = DT;


}
private void sumdvg()
{
// عملیات جمع برای دو ستون دیتاگرید
int sumb = new int();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (Convert.ToBoolean(this.dataGridView1.Rows[0].Cells[4].Value) == false) //خطا در این خط اتفاق می افتد
{
sumb += Convert.ToInt32(row.Cells["cell4"].Value);
lblb.Text = sumb.ToString("n0");
}
}
int sumd = new int();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (Convert.ToBoolean(this.dataGridView1.Rows[0].Cells[5].Value) == true)
{
sumd += Convert.ToInt32(row.Cells["cell5"].Value);
}
}
lbld.Text = sumd.ToString("n0");


}

private void txtb_SelectedValueChanged(object sender, EventArgs e)
{
BindGrid();


BindingSource1.Filter = string.Format("bnk LIKE '%{0}%'", txtb.Text);
sumdvg();
}





خوب داره میگه که اون رکورد دارای داده ی Null هست . و نمیتونه Null رو تبدیل کنه .
داده های که داری میخونی رو چک کن تویه دیتابیس . شما داری تو برنامه میگی Null رو تبدیل کن و برنامه نمیتونه

رامین مرادی
شنبه 20 آبان 1396, 09:50 صبح
این رو چک کن


private void BindGrid()
{
//پر کردن دیتاگرید
DataTable DT = new DataTable();
SqlDataAdapter DAL1 = new SqlDataAdapter("SELECT * from tbl1", scn);
SqlDataAdapter DAL2 = new SqlDataAdapter("SELECT * from tbl2", scn);
DAL2.Fill(DT);
DAL1.Fill(DT);
dataGridView1.DataSource = DT;
BindingSource1.DataSource = DT;


}
private void sumdvg()
{
// عملیات جمع برای دو ستون دیتاگرید
int sumb = new int();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if(this.dataGridView1.Rows[0].Cells[4].Value)!=DBNull.Value)
{
if (Convert.ToBoolean(this.dataGridView1.Rows[0].Cells[4].Value) == false) //خطا در این خط اتفاق می افتد
{
sumb += Convert.ToInt32(row.Cells["cell4"].Value);
lblb.Text = sumb.ToString("n0");
}
}
}
int sumd = new int();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if(this.dataGridView1.Rows[0].Cells[5].Value)!=DBNull.Value)
{
if (Convert.ToBoolean(this.dataGridView1.Rows[0].Cells[5].Value) == true)
{
sumd += Convert.ToInt32(row.Cells["cell5"].Value);
}
}
}
lbld.Text = sumd.ToString("n0");


}

private void txtb_SelectedValueChanged(object sender, EventArgs e)
{
BindGrid();


BindingSource1.Filter = string.Format("bnk LIKE '%{0}%'", txtb.Text);
sumdvg();
}

Iman7228
شنبه 20 آبان 1396, 15:52 عصر
خوب داره میگه که اون رکورد دارای داده ی Null هست . و نمیتونه Null رو تبدیل کنه .
داده های که داری میخونی رو چک کن تویه دیتابیس . شما داری تو برنامه میگی Null رو تبدیل کن و برنامه نمیتونه


ممنون از شما.



رامین مرادی
نقل قول: خطای Object cannot be cast from DBNull to other types
این رو چک کن



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

رامین مرادی
یک شنبه 21 آبان 1396, 08:04 صبح
ممنون از شما.



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

خواهش میکنم. منم اینو از همینجا توسط دوستان یاد گرفتم.
این کد رو هم بیزحمت چک کنید. در صورت null بودن مقدار صفر رو محاسبه میکنه(البته نمیدونم این مقداری که من میذارم مناسب کار شما هست یا نه )


private void BindGrid()
{
//پر کردن دیتاگرید
DataTable DT = new DataTable();
SqlDataAdapter DAL1 = new SqlDataAdapter("SELECT * from tbl1", scn);
SqlDataAdapter DAL2 = new SqlDataAdapter("SELECT * from tbl2", scn);
DAL2.Fill(DT);
DAL1.Fill(DT);
dataGridView1.DataSource = DT;
BindingSource1.DataSource = DT;
}
private void sumdvg()
{
// عملیات جمع برای دو ستون دیتاگرید
int sumb = new int();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if(this.dataGridView1.Rows[0].Cells[4].Value)!=DBNull.Value)
{
if (Convert.ToBoolean(this.dataGridView1.Rows[0].Cells[4].Value) == false) //خطا در این خط اتفاق می افتد
{
sumb += Convert.ToInt32(row.Cells["cell4"].Value);
lblb.Text = sumb.ToString("n0");
}
}
else
{
sumb += 0;
lblb.Text = sumb.ToString("n0");
}
}
int sumd = new int();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if(this.dataGridView1.Rows[0].Cells[5].Value)!=DBNull.Value)
{
if (Convert.ToBoolean(this.dataGridView1.Rows[0].Cells[5].Value) == true)
{
sumd += Convert.ToInt32(row.Cells["cell5"].Value);
}
}
else
{
sumb += 0;
lblb.Text = sumb.ToString("n0");
}

}
lbld.Text = sumd.ToString("n0");
}

private void txtb_SelectedValueChanged(object sender, EventArgs e)
{
BindGrid();
BindingSource1.Filter = string.Format("bnk LIKE '%{0}%'", txtb.Text);
sumdvg();
}

Iman7228
یک شنبه 21 آبان 1396, 17:02 عصر
متاسفانه جواب نمیده.
مشکل پابرجاست

رامین مرادی
دوشنبه 22 آبان 1396, 11:05 صبح
BindGrid();
BindingSource1.Filter = string.Format("bnk LIKE '%{0}%'", txtb.Text);
sumdvg();


شما این کد رو باید درتمام کومبوها تکرار کنید. این کارو کردید؟ کاش پروژتون رو آپلود کنید

Iman7228
دوشنبه 22 آبان 1396, 14:23 عصر
ببینین، من یه کمبو دارم که با دو تا آیتم هاش، اطلاعات از دوتا جدول فراخونی میشه.
الان دسترسی ندارم به پروژه.در اسرع وقت نمونشو میزارم.ممنون

Iman7228
دوشنبه 22 آبان 1396, 16:05 عصر
ببینین، من یه کمبو دارم که از دو تا آیتم هاش از دوتا جدول فراخونی میشه.
الان دسترسی ندارم به پروژه.در اسرع وقت نمونشو میزارم.ممنون

اینم نمونه کاری که میخام انجام بدم

Mahmoud.Afrad
دوشنبه 22 آبان 1396, 23:01 عصر
بایندینگ سورس را به دیتاتیبل متصل نکردید. به صورت زیر عمل کنید
private void BindGrid()
{
//پر کردن دیتاگرید
DataTable dt = new DataTable();
SqlDataAdapter dal1 = new SqlDataAdapter("SELECT * from TBL2 union SELECT * from TBL1", _con);
dal1.Fill(dt);
dataGridView1.AutoGenerateColumns = false;
_bindingSource1.DataSource = dt;
dataGridView1.DataSource = _bindingSource1;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
dataGridView1.Rows[i].Cells[0].Value = i + 1;
}
}
در رویداد تغییر کمبوباکس، اگر از Text استفاده کنید مقدار قبلی را به شما خواهد داد. برای بدست آوردن مقدار جدید از SelectedText یا پراپرتی‌های مشابه استفاده کنید
private void CMBBank_SelectedIndexChanged(object sender, EventArgs e)
{
BindGrid();
_bindingSource1.Filter = string.Format("bank LIKE '%{0}%'", CMBBank.SelectedText);
Sumdvg();
}

Iman7228
سه شنبه 23 آبان 1396, 15:18 عصر
بایندینگ سورس را به دیتاتیبل متصل نکردید. به صورت زیر عمل کنید
private void BindGrid()
{
//پر کردن دیتاگرید
DataTable dt = new DataTable();
SqlDataAdapter dal1 = new SqlDataAdapter("SELECT * from TBL2 union SELECT * from TBL1", _con);
dal1.Fill(dt);
dataGridView1.AutoGenerateColumns = false;
_bindingSource1.DataSource = dt;
dataGridView1.DataSource = _bindingSource1;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
dataGridView1.Rows[i].Cells[0].Value = i + 1;
}
}
در رویداد تغییر کمبوباکس، اگر از Text استفاده کنید مقدار قبلی را به شما خواهد داد. برای بدست آوردن مقدار جدید از SelectedText یا پراپرتی‌های مشابه استفاده کنید
private void CMBBank_SelectedIndexChanged(object sender, EventArgs e)
{
BindGrid();
_bindingSource1.Filter = string.Format("bank LIKE '%{0}%'", CMBBank.SelectedText);
Sumdvg();
}


ممنون ولی جواب نمیده

Mahmoud.Afrad
چهارشنبه 24 آبان 1396, 02:06 صبح
اسکریپت جدول ها را همراه پروژه باید قرار بدید تا بتوانیم تست کنیم.