سلام دوستان
من هر وقت برنامم رو اجرا میکنم و میبندمش این خطا رو میده
error2.png
بعضی از فرم هام اینجوره
![]()
سلام دوستان
من هر وقت برنامم رو اجرا میکنم و میبندمش این خطا رو میده
error2.png
بعضی از فرم هام اینجوره
![]()
دوست عزیز از یه نمونه ای استفاده کردی که به هیچ شی اشاره نکرده یا از کلاسی استفاده کردی و new نکردی ؟؟و از شی اون کلاس داری استفاده میکنی !!!
یه جدول داریم به اسم test دو تا فیلد داره به اسامی id,name و همچنین یه کومبوباکس داریم که پراپرتی های کومبوباکس را به صورت زیر در ایونت load فرم ، به جدول مربوطه متصل یا در اصطلاح بایند کردیم:
private void test_Load(object sender, EventArgs e)
{
SqlConnection Cnn = new SqlConnection("Data Source=.\\sqlexpress;Initial Catalog=Commodity;Integrated Security=True;Pooling=False");
SqlDataAdapter DA = new SqlDataAdapter();
DataSet DS = new DataSet();
DA.SelectCommand = new SqlCommand();
DA.SelectCommand.Connection = Cnn;
DA.SelectCommand.CommandText = "select id,name from test";
DA.Fill(DS, "test");
cbNameComo.DataSource = DS.Tables["test"].DefaultView;
cbNameComo.DisplayMember = "name";
cbNameComo.ValueMember = "id";
}
خب در ایونت SelectedIndexChanged کومبوباکس مربوطه هم کدهای زیر رو اضافه میکنم:
private void cbNameComo_SelectedIndexChanged(object sender, EventArgs e)
{
label1.Text=((sender as ComboBox).SelectedValue as DataRowView)[0].ToString();
}
اما جایی که ارور زمان اجرا اتفاق می افته این کده:
label1.Text=((sender as ComboBox).SelectedValue as DataRowView)[0].ToString();
وقتی که فرم لود شده و یکی از آیتم های کومبوباکس رو انتخاب میکنم این خطا اتفاق می افته:
متن خطا: Object reference not set to an instance of an object.
در واقع کامپایلر داره به SelectedValue گیر میده!!
اگه کسی راهنمایی کنه ممنون میشم
آخرین ویرایش به وسیله Ebrahim_Rayaneh : یک شنبه 27 اسفند 1391 در 14:34 عصر
شما 3 خط آخر رو (11 و 12 و 13) رو بصورت زیر جابجا کن:
cbNameComo.DisplayMember = "name";
cbNameComo.ValueMember = "id";
cbNameComo.DataSource = DS.Tables["test"].DefaultView;
یعنی قبل از اینکه DataSource مربوط ب کمبوباکس رو ست کنی ، ValueMember اش رو ست کن.
چون ب محض اینکه DataSource اش رو ست کنی، رویداد SelectedIndex_Changed رخ می ده و توی این رویداد شما خواستی SelectedValue مربوط ب کمبوباکس رو بگیری ک هنوز معلوم نیس چی توش هس چون خط 13 اجرا نشده
سلام
من موقع گرفتن مقادیر از دیتا گرید این خطا رو میگیرم و دلیلشو نمیدونم.
از این کد خطا میگیره.
dataGridView9.Rows[i].Cells[0].Value.ToString());
اینم عنوان خطا
Object reference not set to an instance of an object.
مشکل از حلقه هست. اگه شرط رو کوچکتر مساوی گذاشتین مساوی رو بردارین
نه حلقه مورد نداره
for (int i = 0; i < dataGridView9.Rows.Count; i++)
میشه کد رو کامل قرار بدین؟
راستی اصلا گرید هیچ مقداری داره؟
مقدار داره اینم کد
for (int i = 0; i < dataGridView9.Rows.Count; i++)
{
try
{
SqlCommand com1 = new SqlCommand("insert into trfactor(namekala,codekala,ghvahed,codefactor,teda d) values(@a,@b,@c,@d,@e)", con);
com1.Parameters.AddWithValue("@a", dataGridView9.Rows[i].Cells[0].Value.ToString());
//check kardane vojoode code kala va jame kala
try
{
string sql2 = string.Format("SELECT * FROM tkala where codekala =" + Convert.ToInt32(dataGridView9.Rows[i].Cells[1].Value));
SqlDataAdapter da2 = new SqlDataAdapter(sql2, con);
DataSet ds2 = new DataSet();
da2.Fill(ds2, "tkala");
DataTable db2 = ds2.Tables["tkala"];
if (db2.Rows.Count == 0)
{
con.Close();
goto next1;
}
//kam kardane meghdare mojoodi kala az meghdare darkhasti kala
if (cnoefa4.Text == "فروش")
{
con.Open();
SqlCommand cmd4;
try
{
cmd4 = con.CreateCommand();
cmd4.CommandText = "update tkala set tedad=@a where codekala=" + dataGridView9.Rows[i].Cells[1].Value;
cmd4.Parameters.AddWithValue("@a", Convert.ToInt32(ds2.Tables[0].Rows[0]["tedad"]) - Convert.ToInt32(dataGridView9.Rows[i].Cells[2].Value));
con.Open();
cmd4.ExecuteNonQuery();
}
catch (SqlException ex)
{
MessageBox.Show(ex.ToString());
}
finally { con.Close(); }
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
next1: ;
com1.Parameters.AddWithValue("@b", Convert.ToInt32(dataGridView9.Rows[i].Cells[1].Value));
com1.Parameters.AddWithValue("@c", Convert.ToInt32(dataGridView9.Rows[i].Cells[3].Value));
com1.Parameters.AddWithValue("@d", Convert.ToInt32(dataGridView9.Rows[i].Cells[2].Value));
com1.Parameters.AddWithValue("@e", Convert.ToInt32(lblcodefa4.Text));
con.Open();
com1.ExecuteNonQuery();
con.Close();
}
catch (SqlException ex)
{
MessageBox.Show(ex.ToString());
}
finally { con.Close(); }
}
MessageBox.Show(".فاکتور با موفقیت ویرایش شد");
هدف شما اینه که اول چک کنید ببینید کالا از قبل وارد شده یا نه. اگه وارد شده بود مقدارشو کم کنه (ویرایش) و اگه وارد نشده بود اونو درج کنه (ثبت رکورد جدید). اگه اشتباه متوجه شدم بگین. اگه هدفتون همینه خیلی شلوغ شده کداتون. خیلی آسونتر و بدون این همه ترای کش میشه کدشو نوشت. اگه هدف دیگه ای دارید، بگین تا اگه شد راه حل بهتری ارائه کرد
شما همون اول که رکورد جدید ثبت میکنین 5تا مقدار برای درج گذاشتین در صورتی که فقط یه پارامتر درج میشه. چرا اول همه پارامترا رو با هم درج نمیکنین؟
اگر دیتاگرید اتوماتیک سطر اضافه میکنه مطمئن بشید index درحال بررسی newRowIndex نباشه
یا مقادیر مورد بررسی null نباشن
for (int i = 0; i < dgvShow.Rows.Count; i++)
{
if (i != dgvShow.NewRowIndex)
{
dgvShow اسم دیتاگرید منه
برنامه درج ویرایش و حذف با linq هست.
درج رو انجام میده ولی برای ویرایش و حذف Exception میده.
اینم کدهام
ادیت:
private void button3_Click(object sender, EventArgs e)
{
var db = new DataClasses1DataContext();
int m = int.Parse(dataGridView1.CurrentRow.Cells[0].Value.ToString());
var QEdit = db.kalas.Where(c => c.ID == m).Single();
QEdit.ID = int.Parse(textBox1.Text);
QEdit.Id_Kala =int.Parse( textBox2.Text);
QEdit.Name_Kala = textBox3.Text;
QEdit.Type = textBox4.Text;
QEdit.Size = int.Parse(textBox5.Text);
QEdit.Color = textBox6.Text;
QEdit.Unit_price = int.Parse(textBox7.Text);
QEdit.Number_Of = int.Parse(textBox8.Text);
db.SubmitChanges();
dataGridView1.DataSource = db.kalas;
}
حذف:
private void button4_Click(object sender, EventArgs e)
{
var db = new DataClasses1DataContext();
int m = int.Parse(dataGridView1.CurrentRow.Cells[0].Value.ToString());
var QDel = db.kalas.Where(c => c.ID == m);
if (QDel.Count() != 0)
{
db.kalas.DeleteOnSubmit(QDel.Single());
db.SubmitChanges();
dataGridView1.DataSource = db.kalas;
}
datagrid هیچ ردیفی نداره واشه همین میگه null هستش
خطاش مشخصه!
یا در گریدتون سطر خاصی انتخاب نشده و یعنی اینکه مقدار dataGridView1.CurrentRow برابر null هست
و یا اینکه مقدار ستون 0 از سطر انتخاب شده ی گرید null هست.
برای اینکه بفهمید کدومش برنامه رو تریس کنید و در این خط چک کنید و ببینید که کدوم یکی مقدارش null هستش.
اگه متوجه نشدین چطوری تریس کنید. این کدها رو قبل از اون خط که خطا میده بذارین و برنامه رو اجرا کنید.
بعد ببینید چه پیامی نشون میده.
if(dataGridView1.CurrentRow == null)
{
MessageBox.Show("CurrentRow is null");
return;
}
if(dataGridView1.CurrentRow.Cells[0].Value == null)
{
MessageBox.Show("Cell Value is null");
return;
}
برای تریس کردن باید در خط مورد نظر یک برک پوینت بذارین.
و بعد برنامه رو با F5 اجرا کنید.
هر وقت که به اون خط برسه متوجه میشین.
و بعد با نگه داشتن موس بر روی متغیر خاص میتونید مقدارش رو مشاهده کنید.
دوستان ممنون از راهنماییتون
مشکل حذف رو حل کردم ولی الان برای ویرایش ارور میگیره:
تا جاییکه من متوجه میشم مشکل اینه :
شما توی جدول کالاهاتون دو یا چند تا کالا با ID یکسان دارین.
خطا هم به این خاطره که عبارت این :
db.kalas.Where(c => c.ID = m)
چند کالا رو برمیگردونه در صورتی که باید حتم یک کالا رو برگردونه.
مگه این ID توی جدول کالا ستون اصلی نیست؟
بسم الله الرحمن الرحیم
با سلام
فکر میکنم باید اون 2 تا کلید اصلی دیگه هم تو شرط دخیل کنید؛ چون چند تا کد اصلی دارید طبیعتا ترکیب اون چند تا برای شما رکورد یکتایی ایجاد میکند مگر اینکه بخواهید تمام رکوردهایی که IDشون برابر m هست حذف کنید که بعید میدونم.
یه چیزی شبیه به کد زیر:
int m2 = int.Parse(dataGridView1.CurrentRow.Cells[1].Value.ToString());
var QDel = db.kalas.Where(c => (c.ID == m) && (c.Id_Kala==m2)).First();
موفق باشید.
اول اینکه هیچکس نه تنها در این تاپیک بلکه در تاپیک های دیگر (البته منظورم از هیچکس بچه هایی هست که تو تالار فعالیت دارن) پاسخ الکی نمیدن بلکه تجربیاتشون رو در اختیار دیگران قرار میدهند. دوم اینکه پاسخ هایی که به شما داده شد همه درست بوند. حالا یکی تجربش کمتر و یکی بیشتر به جای تشکر اینگونه جواب دوستان رو میدید؟
@ در مورد سوالتون :
دوستان ممنون از راهنماییتون
مشکل حذف رو حل کردم ولی الان برای ویرایش ارور میگیره:db.kalas.Where(c => c.ID == m)
c => c.ID == m یعنی چی؟
بگرد جایی که c بیشتر مساوی c.id مساوی با m ?
]چه معنی داره؟
داره میگه اوپراتورها نا معتبر استفاده کردید!!
دوستان چطور میتونم کاری بکنم که فیلد ID بطور اتوماتیک شماره دهی بشه؟
یعنی کاربر نتونه دستکاریش کنه. موقعی که داره اون سطر رو درج میکنه خودش مقدار بگیره.
دوست عزیز من نگفتم که الکی پاسخ میدین منظور من این بود که پاسخ شما اصلا ربطی به این بحث نداشت!!ول اینکه هیچکس نه تنها در این تاپیک بلکه در تاپیک های دیگر (البته منظورم از هیچکس بچه هایی هست که تو تالار فعالیت دارن) پاسخ الکی نمیدن بلکه تجربیاتشون رو در اختیار دیگران قرار میدهند. دوم اینکه پاسخ هایی که به شما داده شد همه درست بوند. حالا یکی تجربش کمتر و یکی بیشتر به جای تشکر اینگونه جواب دوستان رو میدید؟
خودتون بگین کامنت کردن اون سطر چه دخلی داره آخه؟؟؟؟!!!!!!!!!!
به این نوع دستورات میگن LINQc => c.ID == m یعنی چی؟
بگرد جایی که c بیشتر مساوی c.id مساوی با m ?
]چه معنی داره؟
داره میگه اوپراتورها نا معتبر استفاده کردید!!
بیشتر دقت کن دوست عزیز...
الان به یه مشکل دیگه خوردم
من الان 2 تا کلید اصلی دارم
Id_kala و Color ، وقتی دو تا رکورد فیلد Id_kalaشون یکی باشه موقع ویرایش یا حذف همون ارور رو میده.
حالا چطور میتونم اون شرط رو برای دو تا فیلد بزارم که درست بشه؟
متن خطاش رو بخونید خیلی تابلوئه!!!!
متغیر m شما از نوع int هستش و ستون color از نوع String
پس نمیشه اینطوری باهم مقایسشون کنی.
اینطوری بنویس :
c.Color==m.ToString()
بازم از متن خطا مشخصه که دستور مورد نظر خروجی نداره!!!
به این دستور خودتون دقت کنین :
var QDel = db.kalas.Where(c => (c.Id_Kala==m2)&&(c.Color==m.ToString())).First();
وقتی توی این دستور خطای ذکر شده رو میده یعنی اینکه توی جدول هیچ رکوردی نیست که دو شرط رو همزمان داشته باشه!
یعنی هیچ رکوردی نیست که ستون Id_Kala اون برابر m2 باشه و همچنین ستون Color اون برابر m باشه.
متوجه شدین؟
برای اینکه بفهمین دلیلش چیه بهترین روش همونی هست که قبلا بهتون گفتم : استفاده از تریس کردن برنامه
برنامه رو تریس کنید ببینید مقدارهای که در متغیرهای m2 و m هستن واقعا در یک رکورد به طور همزمان هستن یا نه.
موفق باشید
دستورم برای ویرایش و حذف اینه، اون بالایی اشتباه بود:
int m = int.Parse(dataGridView1.CurrentRow.Cells[0].Value.ToString());
var QEdit = db.kalas.Where(c => (c.Id_kala == m) && (c.Colot==m.ToString()))).First();
پس با وجود 2 تا کلید اصلی چه شرطی باید بزارم برای ویرایش و حذف ؟
ببینید دستورتون درسته ولی مقادیری که دارین برای شرط میذارین اشتباهه!
مثلا الان شما مطمئنید که رکورد مورد نظر شما هم ستون Id_Kala اون و هم ستون Colot مقدارشون یکی هست و برابر مقدار m ؟؟؟؟؟؟
به نظرم شما باید اینطوری بنویسید :
int Id = int.Parse(dataGridView1.CurrentRow.Cells[0].Value.ToString());
string MyColot = dataGridView1.CurrentRow.Cells[1].Value.ToString();
var QEdit = db.kalas.Where(c => (c.Id_kala == m) && (c.Colot==MyColot))).First();
فقط در دستورهای اول و دوم مطمئن بشید که شماره ستون مربوط به ستون مورد نظر باشه.
و البته به جای شماره من توصیه میکنم از نام ستون استفاده کنید، به این صورت :
string MyColot = dataGridView1.CurrentRow.Cells["CellName"].Value.ToString();