PDA

View Full Version : سوال: اجرای کد در زمان حرکت بین سطر های دیتا گرید



ozzy_mra
دوشنبه 21 آذر 1390, 14:09 عصر
سلام
من کد زیر رو تو ایونت Row_enter دیتا گرید نوشتم که با حرکت کاربر بر روی سطر های دیتا گرید اطلاعات مربوط به اون سطر گرفته بشه و جواب مناسب برگردونده بشه ولی جواب رو درست بر نمی گردونه و کد با هربا حرکت بین سطرها دو بار برای اون سطر اجرا میشه برای این کار از کدوم ایونت استفاده کنم؟

private void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e)
{
if (dataGridView1.Focused)
{
if (dt.Rows[0][0].ToString() != "" && dataGridView1.CurrentRow.Index <dataGridView1.RowCount)
{
kolT.Text = sarobj.fetchKolTitle(dt.Rows[dataGridView1.CurrentRow.Index][0].ToString());
moinT.Text = sarobj.fetchMoinTitle(dt.Rows[dataGridView1.CurrentRow.Index][0].ToString(), dt.Rows[dataGridView1.CurrentRow.Index][1].ToString());
tafT.Text = sarobj.fetchTafTitle(dt.Rows[dataGridView1.CurrentRow.Index][0].ToString(), dt.Rows[dataGridView1.CurrentRow.Index][1].ToString(),
dt.Rows[dataGridView1.CurrentRow.Index][2].ToString());
if (dt.Rows[dataGridView1.CurrentRow.Index][3].ToString() != "")
{
jozT.Text = sarobj.fetchJozTitle(dt.Rows[dataGridView1.CurrentRow.Index][0].ToString(), dt.Rows[dataGridView1.CurrentRow.Index][1].ToString(),
dt.Rows[dataGridView1.CurrentRow.Index][2].ToString(), dt.Rows[dataGridView1.CurrentRow.Index][3].ToString());
}
else
jozT.Text = "";
}
}
}
dt
یه دیتا تیبل سراسریه که اطلاعات گرید در اون قرار داره

user6627
سه شنبه 22 آذر 1390, 10:54 صبح
سلام
باید از رویداد یا همون اینونت
CellClick
استفاده کنی اول در پنجره
properties
خاصیت های زیر را برای گرید تنظیم کن
MultiSelect = false;
SelectionMode = FullRowSelect;
و بعد از رویداد زیر استفاده کن و با استفاده از
e.RowIndex
به سطر مورد نظر دسترسی داری

private void GridData_CellClick(object sender, DataGridViewCellEventArgs e)
{
e.RowIndex
}

mehdi.mousavi
سه شنبه 29 آذر 1390, 14:22 عصر
سلام.
هدفم پاسخ دادن به این تاپیک نیست، فقط می خواستم بگم که کدتون رو حتما Refactor کنید:


private void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e)
{
if (!dataGridView1.Focused)
return;

int currentRowIndex = dataGridView1.CurrentRow.Index;
if (!(dt.Rows[0][0].ToString() != string.Empty && currentRowIndex < dataGridView1.RowCount))
return;

DataRow row = dt.Rows[currentRowIndex];

string rowZeroValue = row[0].ToString();
string rowOneValue = row[1].ToString();
string rowTwoValue = row[2].ToString();
string rowThreeValue = row[3].ToString();

kolT.Text = sarobj.fetchKolTitle(rowZeroValue);
moinT.Text = sarobj.fetchMoinTitle(rowZeroValue, rowOneValue);
tafT.Text = sarobj.fetchTafTitle(rowZeroValue, rowOneValue, rowTwoValue);

if (rowThreeValue != string.Empty)
jozT.Text = sarobj.fetchJozTitle(rowZeroValue, rowOneValue, rowTwoValue, rowThreeValue);
else
jozT.Text = string.Empty;
}


من کد خودتون رو تغییر دادم و کاری به منطقش نداشتم، فقط هدفم نشون دادن این موضوع بود که هر کدی رو میشه با Refactoring خواناتر کرد:


به نحوه Cache کردن Object هایی که قراره چندین بار استفاده بشه دقت کنید
به Invert کردن if ها دقت کنید (Indenting کد بشدت کم میشه و کد قابل فهم تر میشه)
به استفاده از Literal ها در برنامه دقت کنید (جای "" بنویسید string.Empty)

(طبیعتا اسامی rowZeroValue و ... رو باید به اسامی معناداری تغییر بدید. من چون نمیدوتسم دارید چه فیلدی رو آدرس میکنید، اسم متغیر رو اونطور انتخاب کردم).

موفق باشید.