PDA

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



googoli
دوشنبه 28 آذر 1390, 20:14 عصر
با سلام خدمت اساتید
من یه خط کد نوشته بودم که داشت درست کار می کرد ولی نمی دونم که چرا به این خطا برخوردم و هر چقدر هم که بلد بود تلاش کردم که درستش کنم ولی تا الان که نتونستم مشکلم رو پیدا کنم لطفا شما من را راهنمایی کنید
کد:
txtName.Text = dgvbank.CurrentRow.Cells[1].Value.ToString();
خطا:
Object reference not set to an instance of an object.

system32
دوشنبه 28 آذر 1390, 20:56 عصر
ظاهرا خاصیت SelectionMode را تغییر دادید.

googoli
دوشنبه 28 آذر 1390, 21:38 عصر
ظاهرا خاصیت SelectionMode را تغییر دادید.
بله من این خاصیت رو به fullrowselect تغییر دادم ولی بعید می دونم از این مورد باشه چون من در فرم های دیگه هم همین تغییر رو دادم ولی به هیچ مشکلی بر نخوردم

روی مقدار خالی کلیک میکنید که این پیغام رو میده؟ یا همیشه؟
از همون ابتدا یا بهتر بگم از همون فورم لود این خطا رو میده

googoli
سه شنبه 29 آذر 1390, 10:02 صبح
کسی نیست من را یاری کند؟:گریه:

system32
سه شنبه 29 آذر 1390, 11:24 صبح
گرفتم چی شده شما اومدید تو رویداد لود فرمتون این کدو نوشتید در حالیکه هنوز تو لود فرم نه دیتاگری اضافه شده نه اطلاعات بهش بایند شده شما باید در سازنده فرم این دستور و بنویسید یا در رویداد Shown یا هر رویدادی که بعد از کامل شدن بارگذاری گریدویو انجام شد انجام بشه.

googoli
سه شنبه 29 آذر 1390, 11:56 صبح
نه عزیز دل من تو فرم این دستورات رو ننوشتم تو رویداد selection changeدیتاگرید دستوراتم رو نوشتم ولی این ارور وقتی رخ میده که فرمم را اجرا می کنم اکه یه کم به عنوان تاپیک هم دقت می کردید این موضوع رو متوجه می شدید

googoli
سه شنبه 29 آذر 1390, 15:32 عصر
منظورم از Form_load این بود که زمانی که فزمم رو اجرا می کنم نه رویداد Form_load

googoli
چهارشنبه 30 آذر 1390, 12:42 عصر
من کدها رو میذارم شاید بهتر بتونید راهنماییم کنید

private void frmBank_Load(object sender, EventArgs e)
{
_dataAccess.CreatCommand("[dbo].[SelectBank]", CommandType.StoredProcedure);
dgvbank.DataSource = _dataAccess.ExecuteDatatable();
dgvbank.Columns[0].Visible = false;
dgvbank.Columns[1].HeaderText = "نام بانک";
dgvbank.Columns[1].Width = 173;
dgvbank.Columns[2].HeaderText = "شماره حساب";
dgvbank.Columns[2].Width=250;
dgvbank.Columns[3].HeaderText = "نوع حساب";
dgvbank.Columns[3].Width = 150;
}



private void dgvbank_SelectionChanged(object sender, EventArgs e)
{
txtName.Text = dgvbank.CurrentRow.Cells[1].Value.ToString();
}

googoli
چهارشنبه 30 آذر 1390, 13:20 عصر
این نکته هم اضافه کنم که اگر من این خط کد رو در tryقرار بدم هنگام اجرای فرم یه خطا میده و وقتی که خطا رو تایید می کنم فرم باز میشه و به درستی کار می کنه

try
{
txtName.Text = dgvbank.CurrentRow.Cells[1].Value.ToString();
txtNumber.Text = dgvbank.CurrentRow.Cells[2].Value.ToString();
cmbType.Text = dgvbank.CurrentRow.Cells[3].Value.ToString();
}
catch(Exception ex)
{
MessageBox.Show("Error : \n\t"+ex);
}

Mahmoud Zaad
چهارشنبه 30 آذر 1390, 13:54 عصر
سلام
اگه دقت کرده باشی زمانی که دیتاگریدویو روی فرم هست فوکوس میره روی اولین سلول، حالا اگه TabStop دیتاگریدویو رو فالس کنی(زمانیکه دیتاگریدویو بایند نیست) مشکل حل میشه اما شما وقتی توی لود فرم دیتاگریدویو رو پر می کنی دوباره فوکوس روی دیتاگریدویو قرار میگیره در همین حین! تا اولین رکورد می خواد توی دیتاگریدویو قرار بگیره رویداد Selection Changed روی میده و چون هنوز مقادیر سطر اول null هستند این ارور بوجود می آد حالا شما اگه یه if ساده به شکل زیر بنویسی مشکل حل میشه:
if (dataGridView1.CurrentRow.Cells[0].Value != null)
{
textBox1.Text = dataGridView1.CurrentRow.Cells[0].Value.ToString();
}

googoli
چهارشنبه 30 آذر 1390, 18:59 عصر
حالا اگر چند سلول داشته باشم چی باید چکار کنم ؟ این فقط برای یک سلول هست

Mahmoud Zaad
چهارشنبه 30 آذر 1390, 19:26 عصر
داخل بلاک if کدهایی شبیه به کدی که نوشتم برای سایر تکست باکسها (و ستون ها)بنویسید.

spring69
چهارشنبه 30 آذر 1390, 19:52 عصر
سلام شما میتونی رویداد رو بعد از پرکردن داده ها، به کنترلتون نسبت بدید که زمان پر شدن، این رویداد اجرا نشه و براتون مشکل ساز نشه.اینجوری از کد نویسی اضافی جلوگیری میشه.

majidrezaei2007
پنج شنبه 01 دی 1390, 00:54 صبح
مشکل اینجاست که شما وقتی رو یک سطر کلیک می کنید ، سطری که فعال میشه ، ستون با اندیس 1 خالیه و تو دیتا گرید بر خلاف بعضی کنترل های دیگه ، مقدار خالی با null نسبت داده میشه و تابع tostring نمیتونه مقدار null رو تبدیل به یک رشته بکنه
اگه میتونید بهتره که جلوی کلیک روی سطرهای خالی رو بگیرید
راه بعدی اینه که به جای tostring از دستور convert.tostring استفاده کنید بدین شکل txtName.Text = Convert.ToString(dgvbank.CurrentRow.Cells[1].Value); مشکل حل میشه و null تبدیل میشه به رشته ای با طول 0
راه بعدی هم استفاده از دستور try catch هست دیگه

majidrezaei2007
پنج شنبه 01 دی 1390, 00:56 صبح
tostring نمیتونه null رو به رشته ای با طول صفر تبدیل کنه
از Convert استفاده کن به این شکل ، مشکلت حل میشه txtName.Text = Convert.ToString(dgvbank.CurrentRow.Cells[1].Value);
یا اینکه از try catch

asadegha
پنج شنبه 01 دی 1390, 03:25 صبح
بیا از این استفاده کن حل میشه.

if (dgvBank.CurrentRow.Cells[dgvBank.CurrentCell.ColumnIndex].Value != null)

Yanehsar
شنبه 09 اردیبهشت 1391, 18:50 عصر
بیا از این استفاده کن حل میشه.

if (dgvBank.CurrentRow.Cells[dgvBank.CurrentCell.ColumnIndex].Value != null)


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


Object reference not set to an instance of an object.

Mahmoud.Afrad
شنبه 09 اردیبهشت 1391, 22:45 عصر
منظورتون از عنوان همون هدر ستونهاست؟
احتمالا از رویداد موس کلیک هم استفاده کردید که چنین خطایی میده. برای رفع خطا رویداد موس کلیک رو همراه با یک شرط بنویسید تا در صورتی که اندیس معتبر بود انجام بشه :


private void dgv_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if ( e.RowIndex >= 0 )
{
.....
}
}

Yanehsar
شنبه 09 اردیبهشت 1391, 23:08 عصر
نه ازSelectionChanged استفاده کردم البته یه بار که به مشکل برخوردم از موس کلیک استفاده کردم اما مشکلم حل شد پاکش کردم.این کلیه کدهای صفحه من دو تا مشکل دارم یکی همین هدر فایل یکی وقتی میرم صفحه 2 برمیگردم صفحه 1 کدهای آپدید صفحه خطا داره و بعدش کارشو انجام میده.یکی بگه چیکار کنم:گریه:


OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Application.StartupPath + "/dic.mdb");
OleDbDataAdapter da = new OleDbDataAdapter();
DataSet ds = new DataSet();
DataView dv = new DataView();
private void frmmain_Load(object sender, EventArgs e)
{
try
{
if (con.State == ConnectionState.Closed)
con.Open();
da = new OleDbDataAdapter("select * from Dictionary", con);
da.Fill(ds, "Dictionary");
dv.Table = ds.Tables["Dictionary"];
dgw.DataSource = dv;
dgw.Columns["ID"].Visible = false;
dgw.Columns[1].HeaderText = "لغت";
dgw.Columns["mani"].Visible = false;
dgw.Columns["grouploghat"].Visible = false;
con.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
if (con.State == ConnectionState.Open) con.Close();
}
}
private void txtloghat_TextChanged(object sender, EventArgs e)
{

try
{
dv.RowFilter = "loghat like '%" + txtloghat.Text + "%'";
dgw.DataSource = dv;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void btnadd_Click_1(object sender, EventArgs e)
{
frmaddloghat loghat = new frmaddloghat();
loghat.ShowDialog();
ds.Clear();
frmmain_Load(sender, e);
}
private void dgw_SelectionChanged(object sender, EventArgs e)
{
try
{
if (dgw.CurrentRow.Cells[dgw.CurrentCell.ColumnIndex].Value != null)
{
txtgroup.Text = dgw.CurrentRow.Cells["grouploghat"].Value.ToString();
richTxtbox.Text = dgw.CurrentRow.Cells["mani"].Value.ToString();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}

Mahmoud.Afrad
یک شنبه 10 اردیبهشت 1391, 00:50 صبح
به جای رویداد selectionchange از رویداد cellEnter استفاده کنید تا با کلیک روی هدرستونها خطایی رخ نده.
با این کار خطای مربوط به بستن فرم2 و برگشت هم حل میشه(این خطا هم به خاطر رویداد selectionchange هست).

Yanehsar
یک شنبه 10 اردیبهشت 1391, 08:25 صبح
به جای رویداد selectionchange از رویداد cellEnter استفاده کنید تا با کلیک روی هدرستونها خطایی رخ نده.
با این کار خطای مربوط به بستن فرم2 و برگشت هم حل میشه(این خطا هم به خاطر رویداد selectionchange هست).

خیلی خیلی ممنونم ازتون :قلب: