PDA

View Full Version : سوال: منوی راست کلیک در datagridview



بیتا حکمت
سه شنبه 15 اردیبهشت 1394, 11:24 صبح
سـلام . دوستان وقت بخیر . من این کد رو از سایتی برداشتم . که با راست کلیک روی دیتاگرید یک منو نشون می ده و زیر منوهای اون Copy ,cut ,paste هست . حالا دو تا سوال دارم :

سوال اول : چطور باید تشخیص بدم که کاربر کدوم یک از زیـرمنوها رو انتخاب کـــرده و براش کد بزنم ، مثلا" اگر Cut رو انتخاب کرده پیام بدم: " شما کات رو انتخاب کردید "

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




private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
ContextMenu m = new ContextMenu();
m.MenuItems.Add(new MenuItem("Cut"));
m.MenuItems.Add(new MenuItem("Copy"));
m.MenuItems.Add(new MenuItem("Paste"));





m.Show(dataGridView1, new Point(e.X, e.Y));

}
}

محمد رضا فاتحی
سه شنبه 15 اردیبهشت 1394, 11:54 صبح
خانم حکمت با اجازه من یه ذره تغییرش بدم
private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) {

if (e.Button == MouseButtons.Right)
{
ContextMenuStrip m = new System.Windows.Forms.ContextMenuStrip();
m.Items.Add("Cut");

m.Items.Add("Copy");
m.Items.Add("Past");
m.ItemClicked += new ToolStripItemClickedEventHandler(m_ItemClicked);




m.Show(dataGridView1, new Point(e.X, e.Y));

}

}

بهتره از ContextMenuStrip استفاده کنید

اینم برای Event

public void m_ItemClicked(object sender,ToolStripItemClickedEventArgs e) {

// MessageBox.Show(e.ToString());
if (e.ClickedItem.Text == "Cut")
{
MessageBox.Show("Cut");
}
}

و برای سوال دومتون تو شرط if (e.Button == MouseButtons.Right) شرط مربوط به نام ستون رو هم اضافه کنید

بیتا حکمت
سه شنبه 15 اردیبهشت 1394, 13:11 عصر
خانم حکمت با اجازه من یه ذره تغییرش بدم
private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) {

if (e.Button == MouseButtons.Right)
{
ContextMenuStrip m = new System.Windows.Forms.ContextMenuStrip();
m.Items.Add("Cut");

m.Items.Add("Copy");
m.Items.Add("Past");
m.ItemClicked += new ToolStripItemClickedEventHandler(m_ItemClicked);




m.Show(dataGridView1, new Point(e.X, e.Y));

}

}

بهتره از ContextMenuStrip استفاده کنید

اینم برای Event

public void m_ItemClicked(object sender,ToolStripItemClickedEventArgs e) {

// MessageBox.Show(e.ToString());
if (e.ClickedItem.Text == "Cut")
{
MessageBox.Show("Cut");
}
}

و برای سوال دومتون تو شرط if (e.Button == MouseButtons.Right) شرط مربوط به نام ستون رو هم اضافه کنید

سـلام . بی نهایت ممنونم .اول یه نکته رو بگم که که کد شما رو تو ataGridView1_MouseClick نوشتم . چون وقتی کد رو داخل رویداد CellMouseClick می نوشتم
منوی ظاهر شده از سلولی که روش کلیک میشه فاصله داشت

دو سوال دیگه برام پیش اومد (البته سوال کوتاهه :لبخند:) ممنونم میشم جواب بدین .


تصویر اول

http://uupload.ir/files/5i2_1.png (http://uupload.ir/)

تصویر دوم

http://uupload.ir/files/44qg_2.jpg (http://uupload.ir/)

من میخوام که کاربر نتونه اندازه ای که برای هدر تکست سلول در نظر گرفته شده تغییر بده ، تو شکل می بنید کاربر می تونه فضای " امتیاز ترم قبلی" به قدری بزرگ کنه که
امتیاز ترم جاری دیده نمیشه خاصیت Reaonly رو برابر true قرار دادم اما حل نشد .

سوال دومم اینکه ، اگه بخوام انتخاب از دیتاگرید به صورت یک سطر باشه یعنی ( مثل عکس دوم و سطر اول ) باید چی کار کنم ؟ یعنی چه روی امتیاز جاری باشه کلیک شه ، چه روی امتیاز قبلی ، چه روی کد ، در هر سطری که هستیم که همون سطر فعال شه

بیتا حکمت
سه شنبه 15 اردیبهشت 1394, 14:22 عصر
به یاری خدا و همت بلند مسولین جوااب رو پیدا کردم .

برای اینکه فقط یه سلول انتخاب نشه بلکه سطر انتخاب بشه




dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;



بــرای اینکـه از انتخاب همزمان چند سطر جلوگیری کنیم




dataGridView1.MultiSelect = false;



و برای اینکه اجازه تغییر سایز رو از کاربر بگیریم



ataGridView1.AllowUserToResizeColumns = false;

ghasem110deh
سه شنبه 15 اردیبهشت 1394, 17:00 عصر
سلام
بنظر من بهتره کنترل مربوطه رو به فرم اضافه کنید ، تا اینکه همش رو از اول کدنویسی کنید ! (عکس ضمیمه)
اون حالت های بالا رو هم از توی پنجره properties میشه اعمال کرد!
واسه اینکه منو فقط روی گریدویو باز بشه و سطر مورد نظر هم انتخاب بشه :

private int rowIndex = 0; ///// انتخاب یک سطر از دیتاگریدویو با کلیک راست////// private void dataGridView1_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
this.dataGridView1.Rows[e.RowIndex].Selected = true;
this.rowIndex = e.RowIndex;
this.dataGridView1.CurrentCell = this.dataGridView1.Rows[e.RowIndex].Cells[1];
this.contextMenuStrip1.Show(this.dataGridView1, e.Location);
contextMenuStrip1.Show(Cursor.Position);
}
}

مقدار متغیر rowIndex با انتخاب هر سطر از گریدویو ... که در واقع با کلیک راست روی هر سطر اتفاق میوفته ، به شماره همون سطر تغییر میکنه
در خط آخر هم که میگه موقعیت منو جایی باشه که کلیک راست شده !
حالا میشه با دوبار کلیک کردن روی هر آیتم از منو دستورات مورد نظر رو نوشت : (مثلا حذف از بانک)

private void حذفسطرToolStripMenuItem_Click(object sender, EventArgs e) // حذف سطر منتخب و حذف اطلاعات از دیتاگریدویو و بانک {
try
{
if (MessageBox.Show("آیا سطر انتخاب شده حذف شود", "حذف", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
try
{
int row1 = Convert.ToInt32(dataGridView1.CurrentRow.Cells["Id"].Value);
SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=AnbarDB;Integrated Security=True");
SqlCommand com = new SqlCommand();
com.Connection = con;
com.CommandText = "Delete From TVahed WHERE Id=@i";
com.Parameters.AddWithValue("@i", row1);
con.Open();
com.ExecuteNonQuery();
if (!this.dataGridView1.Rows[this.rowIndex].IsNewRow)
{
this.dataGridView1.Rows.RemoveAt(this.rowIndex);
}
}
catch
{
MessageBox.Show("عملیات انجام نشد", "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
con.Close();
con.Dispose();
}
}
}
catch
{
}
}

اینجا هم ابتدا شماره سطر (Id) که روش کلیک راست شده بدست میاریم بعد دستورات اجرا میشه ...
و بعد از اجرای کوئری حذف ، همون سطر رو هم از گریدویو حذف میکنیم !
.
.
.
امیدوارم بدردتون بخوره !