PDA

View Full Version : مشکل در datagridview



marya0030
سه شنبه 03 دی 1398, 23:00 عصر
دوستان در این پروژه بنده با یک آدم گیر و تنبل در افتااااااادم :عصبانی::شیطان:

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




پروژه میزارم و کدهای خودم



private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
textBox5.Text = dataGridView1.CurrentRow.Cells[3].Value.ToString();


try
{
string s1 = ".jpg";


textBox7.Text = string.Concat(textBox6.Text, textBox5.Text);


textBox7.Text = string.Concat(textBox7.Text, s1);
pictureBox1.Image = Image.FromFile(textBox7.Text);


pictureBox2.Visible = false;
}


catch
{


MessageBox.Show("عکس وجود ندارد");




}


}




151170

ROSTAM2
چهارشنبه 04 دی 1398, 07:50 صبح
سلام به رویدادهای datagridview رجوع کنید ی رویداد برای تغییر ردیف داره. اسمشو دقیق یادم نیست. پس خودت بگرد دنبالش.

marya0030
چهارشنبه 04 دی 1398, 08:21 صبح
سلام به رویدادهای datagridview رجوع کنید ی رویداد برای تغییر ردیف داره. اسمشو دقیق یادم نیست. پس خودت بگرد دنبالش.


سلام منم دنبال همون رویدادم :افسرده:

ASHKANLAEI
چهارشنبه 04 دی 1398, 08:32 صبح
منظورتون رویداد SelectionChanged هست؟

marya0030
چهارشنبه 04 دی 1398, 10:38 صبح
منظورتون رویداد SelectionChanged هست؟

اره ولی نمیدونم دقیق کدوم رویدادش هست شما میدونید

سلکشن چنجی من نمیبینم

ASHKANLAEI
چهارشنبه 04 دی 1398, 11:05 صبح
اره ولی نمیدونم دقیق کدوم رویدادش هست شما میدونید

سلکشن چنجی من نمیبینم
همین رویداد به همین نام در datageidview موجوده: https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.datagridview.selectionchanged ?view=netframework-4.8

marya0030
چهارشنبه 04 دی 1398, 12:21 عصر
همین رویداد به همین نام در datageidview موجوده: https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.datagridview.selectionchanged ?view=netframework-4.8


دوست عزیز من با این رویداد مشکلم حل شد :قلب:
کدش میزارم
البته یک رویدادی هم گذاشتم که کاربر اگ کلیک کرد باز نشون بده



private void dataGridView1_KeyUp(object sender, KeyEventArgs e)
{
textBox5.Text = dataGridView1.CurrentRow.Cells[3].Value.ToString();


try
{
string s1 = ".jpg";


textBox7.Text = string.Concat(textBox6.Text, textBox5.Text);


textBox7.Text = string.Concat(textBox7.Text, s1);
pictureBox1.Image = Image.FromFile(textBox7.Text);


pictureBox2.Visible = false;
}


catch
{


MessageBox.Show("عکس وجود ندارد");




}

ASHKANLAEI
چهارشنبه 04 دی 1398, 12:48 عصر
دوست عزیز فکر کنم با کد آخری که گذاشتین ارور به وجود بیاد.
چون در رویداد keyUp نوشتید. پس یعنی اگر هیچ یک از آیتم ها انتخاب نشده بود و شما یک کلید بزنید که باعث انتخاب شدن آیتمی نشه، هنوز آیتم انتخاب شده ای وجود نداره و ارور به وجود میاد.

the king
چهارشنبه 04 دی 1398, 13:12 عصر
به درستی اشاره کردن، رخداد SelectionChanged ئه. و البته در اغلب موارد CurrentRow مشخصه مناسب نیست، باید بجاش از dataGridView1.SelectedRows[0] استفاده بشه. CurrentRow آخرین سطری رو مشخص میکنه که عملیاتی رویش انجام شده، مثلا انتخاب شده یا از حالت انتخاب در اومده و ... برای همین ممکنه به سطری اشاره کنه که دیگه در حالت انتخاب شده نیست. به ندرت مواردی پیدا میشه که CurrentRow انتخاب مناسبی باشه.

در ضمن معمولا در DataGridView یا ListView و ... علاوه بر نمایش داده عملیات هایی مثل حذف و ویرایش و ... هم داریم و نیازه به مقادیر داخل سطر ها رجوع بشه.
لذا اگر برای داده هاتون یک کلاس یا ساختار (struct) تعریف کرده اید، بهتره که از اشیاء همون کلاس یا ساختار در DataGridView تون استفاده کنید تا مجبور نشید برای دسترسی به تصویر مربوط به فلان سطر با textBox و ... درگیر بشید.
مثلا فرض کنیم یک کلاس مثل Person داریم که قراره در DataGridView نمایش داده بشه :

using System.Globalization;
using System.IO;

public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string PhotoId { get; set; }
public DateTime Date { get; set; }

public string PhotoPath => Path.Combine(Environment.CurrentDirectory, "Photos\" + PhotoId + ".jpg");

public Person(string firstName, string lastName, string photoId, DateTime date)
{
FirstName = firstName;
LastName = lastName;
PhotoId = photoId;
Date = date;
}
}
می توانیم برای این کلاس Format تعریف کنیم تا DataGridView بتونه یک شیء از این کلاس رو بصورت های متفاوتی نشون بده :

using System.Globalization;
using System.IO;

public class Person : IFormattable
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string PhotoId { get; set; }
public DateTime Date { get; set; }

public string PhotoPath => Path.Combine(Environment.CurrentDirectory, "Photos\" + PhotoId + ".jpg");

public Person(string firstName, string lastName, string photoId, DateTime date)
{
FirstName = firstName;
LastName = lastName;
PhotoId = photoId;
Date = date;
}

public string ToString(string format, IFormatProvider formatProvider)
{
switch (format.ToLower())
{
case "firstname":
return FirstName;
case "lastname":
return LastName;
case "photoid":
return PhotoId;
case "date":
var persian = new PersianCalendar();
return $"{persian.GetYear(Date):0000}/{persian.GetMonth(Date):00}/{persian.GetDayOfMonth(Date):00}";
default:
return string.Empty;
}
}
}

و در هر کدوم از ستون های DataGridView مشخص کنیم که چه فیلدی رو نمایش بده، مثلا lastname برای ستونی که قراره نام خانوادگی رو نشون بده و date برای ستونی که تاریخ رو نشون میده :
151177
و موقع درج سطر در DataGridView همه ستون ها همون شیء Person هستند، نه مقدار یک فیلد که بعدا ربط دادنش به شیء داده مون دشوار میشد :

private void button1_Click(object sender, EventArgs e)
{
var persian = new PersianCalendar();
var item = new Person("محسن", "غلامی", "6106", new DateTime(1380, 11, 8, persian));
dataGridView1.Rows.Add(item, item, item, item);
}


و هر زمان بخواهیم فرضا PhotoPath رو دریافت کنیم، شیء person در همه ستون ها قرار داره :

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count == 0)
{
return;
}
try
{
var person = (Person)dataGridView1.SelectedRows[0].Cells[0].Value;
pictureBox1.BackgroundImageLayout = ImageLayout.Zoom;
pictureBox1.BackgroundImage = Image.FromFile(person.PhotoPath);
}
catch
{
pictureBox1.BackgroundImage = null;
}
}

marya0030
پنج شنبه 05 دی 1398, 08:04 صبح
به درستی اشاره کردن، رخداد SelectionChanged ئه. و البته در اغلب موارد CurrentRow مشخصه مناسب نیست، باید بجاش از dataGridView1.SelectedRows[0] استفاده بشه. CurrentRow آخرین سطری رو مشخص میکنه که عملیاتی رویش انجام شده، مثلا انتخاب شده یا از حالت انتخاب در اومده و ... برای همین ممکنه به سطری اشاره کنه که دیگه در حالت انتخاب شده نیست. به ندرت مواردی پیدا میشه که CurrentRow انتخاب مناسبی باشه.

در ضمن معمولا در DataGridView یا ListView و ... علاوه بر نمایش داده عملیات هایی مثل حذف و ویرایش و ... هم داریم و نیازه به مقادیر داخل سطر ها رجوع بشه.
لذا اگر برای داده هاتون یک کلاس یا ساختار (struct) تعریف کرده اید، بهتره که از اشیاء همون کلاس یا ساختار در DataGridView تون استفاده کنید تا مجبور نشید برای دسترسی به تصویر مربوط به فلان سطر با textBox و ... درگیر بشید.
مثلا فرض کنیم یک کلاس مثل Person داریم که قراره در DataGridView نمایش داده بشه :

using System.Globalization;
using System.IO;

public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string PhotoId { get; set; }
public DateTime Date { get; set; }

public string PhotoPath => Path.Combine(Environment.CurrentDirectory, "Photos" + PhotoId + ".jpg");

public Person(string firstName, string lastName, string photoId, DateTime date)
{
FirstName = firstName;
LastName = lastName;
PhotoId = photoId;
Date = date;
}
}
می توانیم برای این کلاس Format تعریف کنیم تا DataGridView بتونه یک شیء از این کلاس رو بصورت های متفاوتی نشون بده :

using System.Globalization;
using System.IO;

public class Person : IFormattable
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string PhotoId { get; set; }
public DateTime Date { get; set; }

public string PhotoPath => Path.Combine(Environment.CurrentDirectory, "Photos" + PhotoId + ".jpg");

public Person(string firstName, string lastName, string photoId, DateTime date)
{
FirstName = firstName;
LastName = lastName;
PhotoId = photoId;
Date = date;
}

public string ToString(string format, IFormatProvider formatProvider)
{
switch (format.ToLower())
{
case "firstname":
return FirstName;
case "lastname":
return LastName;
case "photoid":
return PhotoId;
case "date":
var persian = new PersianCalendar();
return $"{persian.GetYear(Date):0000}/{persian.GetMonth(Date):00}/{persian.GetDayOfMonth(Date):00}";
default:
return string.Empty;
}
}
}

و در هر کدوم از ستون های DataGridView مشخص کنیم که چه فیلدی رو نمایش بده، مثلا lastname برای ستونی که قراره نام خانوادگی رو نشون بده و date برای ستونی که تاریخ رو نشون میده :
151177
و موقع درج سطر در DataGridView همه ستون ها همون شیء Person هستند، نه مقدار یک فیلد که بعدا ربط دادنش به شیء داده مون دشوار میشد :

private void button1_Click(object sender, EventArgs e)
{
var persian = new PersianCalendar();
var item = new Person("محسن", "غلامی", "6106", new DateTime(1380, 11, 8, persian));
dataGridView1.Rows.Add(item, item, item, item);
}


و هر زمان بخواهیم فرضا PhotoPath رو دریافت کنیم، شیء person در همه ستون ها قرار داره :

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count == 0)
{
return;
}
try
{
var person = (Person)dataGridView1.SelectedRows[0].Cells[0].Value;
pictureBox1.BackgroundImageLayout = ImageLayout.Zoom;
pictureBox1.BackgroundImage = Image.FromFile(person.PhotoPath);
}
catch
{
pictureBox1.BackgroundImage = null;
}
}



ممنوووووون سپاس گذارم عالی بودی تو این پروژه بنده به شما خیلی بدهکارم بدون راهنمایی شما مهندس نمی تونستم تمامش کنم :خجالت: