PDA

View Full Version : rename کردن عکس پس از انتخاب با openfiledialog



alasht
شنبه 12 تیر 1389, 11:16 صبح
با سلام
من با کمک دوستان یه فرم ساختم که میتونه عکس رو با openfiledialog بگیره و تو picturebox نمایش بده و وقتی رو دکمه ذخیره کلیک کردم میره تو پوشه مورد نظر من ذخیره میشه
اما اینجا یه مشکلی هست مشکل اینه که وقتی اسم عکس شبیه هم باشه برنامه ارور میده من چیکار میتونم بکنم که وقتی رو دکمه ذخیره کلیک کردم اسم عکسم عوض بشه و به جاش عدد بنویسه یعنی اگه اسم عکسم این بود
image.jpg تبدیل بشه به این
3.jpgمیخوام اسم عکسم مطابق با ID دیتابیسم باشه یعنی اگه ID داخل دیتابیس 50 بود اسم عکسم هم بشه 50 که بهترین راه برای جلوگیری از تکراری شدن اسم عکسهاست البته میخوام این عمل برای همه فرمتها انجام بشه jpg , png , gif و.....
اگر راهی هست دوستان لطفا راهنمایی کنن ( برنامه رو هم ضمیمه کردم )
با تشکر

spring69
شنبه 12 تیر 1389, 11:31 صبح
سلام.
این خط رو برای ذخیره بنویس:

File.Copy(txtadress.Text, Application.StartupPath + "\\Image\\" + Path.GetFileName(openpic.FileName),true);

alasht
شنبه 12 تیر 1389, 11:51 صبح
سلام
ممنون از پاسختون
ولی این کد که شما دادی عمل نمیکنه
یعنی عکسهای غیر همنام رو ذخیره میکنه ولی عکسهای هم نام رو ذخیره نمی کنه ولی من میخوام هر دو عکس ذخیره بشه ولی با یه اسم دیگه
امیدوارم متوجه منظورم شده باشید

spring69
شنبه 12 تیر 1389, 12:21 عصر
خواهش میکنم.
خوب اگه درست متوجه شده باشم شما میخای عکس رو با اسم دلخواه ذخیره کنید. خوب برای اینکار توی همون خط به جای

Path.GetFileName(openpic.FileName)

میتونید اسم دلخواه خودتون رو بنویسید.

alasht
شنبه 12 تیر 1389, 12:27 عصر
من کد رو به این صورت تغییر دادم و عمل کرد
File.Copy(txtadress.Text, Application.StartupPath + "\\Image\\" + Path.GetFileName("1232.jpg") ,true);

ولی یه مشکل دیگه هست اونم اینه که من حتما باید پسوند فایل رو وارد کنم تا درست ذخیره بشه نمیشه کاری کرد که فقط اسمش عوض بشه و فرمت فایل تغییر نکنه ؟

alasht
شنبه 12 تیر 1389, 13:16 عصر
کسی نمیتونه راهنماییم کنه ؟

spring69
شنبه 12 تیر 1389, 14:19 عصر
من این کد به نظرم رسید:

File.Copy(txtadress.Text, Application.StartupPath + "\\Image\\" + "1" + Path.GetExtension(txtadress.Text), true);

alasht
شنبه 12 تیر 1389, 14:46 عصر
:تشویق: ایول چیز باحالی بود
ولی حالا میخوام خودش عدد رو تولید کنه اینی که شما دادی یه عدد ثابت هست ولی من مثلا میخوام اسم عکس رو از ID دیتابیس بگیره و به عنوان اسم عکس بزاره
به عنوان مثال من یه صفحه ثبت نام دارم و یه دیتابیس از نوع اکسس و دیتابیس من سه تا فیلد داره به اسم ID,esm,famil که فیلد ID ما auto number هست
حالا من وقتی یه کاربر رو به دیتابیس اضافه مینم Id هم افزایش پیدا میکنه فرض کنید من سه تا کاربر از قبل دارم و اخرین شماره ID من 3 هست حالا قصد دارم کاربر چهارم رو ثبت کنم همراه با عکس .
چیکار کنم که اسم عکسم بشه شماره Id طرف یعنی من وقتی کاربر چهارم رو وارد کردم اسم عکسش بشه

4.jpgشرمنده اینقدر سوال میکنم فکر کنم اگه این سوالم هم به نتیجه برسه دیگه مشکلم حل میشه :قلب:

mmd2009
شنبه 12 تیر 1389, 14:49 عصر
با سلام

حالا شاید به درد نخوره این حرفم ولی میگم :لبخند:

شما بهتره max درون فیلد id رو بگیرید و اون بعلاوه 1 بکنید و بذاریت واسه نام عکستون البته چون گفتید اتو نامبر هستش :ناراحت:

alasht
شنبه 12 تیر 1389, 15:38 عصر
ممنون از پاسخت این فکر به ذهن خودم هم رسیده بود ولی یه مشکلی داره مثلا شاید از بین جداول چند تا جدول رو پاک کرده باشی و id هم حالت صعودی داره و برنمگیرده و اینطوری نظم کار بهم میخوره به عنوان مثال شما 4 تا کاربر ثبت شده داری دو تاشو پاک کنی می مونه شماره های 1 و 2 و اگه بخوای یوزر جدید بسازی شمارش میشه 5 و اگه بزرگترینID ما که همون 2 هست رو به علاوه 1 کنی برای اسم عکسش بزاری میشه 3 که در صورتی کاربر ما شماره 5 هست و نظم بهم میخوره
من به این دلیل میخوام منظم باشه که تو جستجو بتونم از این ترتیب استفاده کنم
بازم ممنون اگه راههی به ذهنت رسید دریغ نکن :قلب:

mmd2009
شنبه 12 تیر 1389, 15:59 عصر
خب حالا یه چیزی میگم ولی شاید زیاد جالب نباشه

به نظر من ابتدا رکورد خودتون رو ثبت کنید ولی عکس رو ثبت نکنید سپس عملیات ویرایش رو انجام بدید به طوری که مقدار ای دی رو بخونید و اسم ای دی رو بذارید واسه نام عکستون

این بهترین راهی هست که به ذهن من رسید البته زیاد هم فکر نکردم :لبخند:

alasht
شنبه 12 تیر 1389, 15:59 عصر
حالا ماکس ID رو چطوری مگیرن ؟ :لبخند:
طوری که بشه رو اون کده پیادش کرد
فعلا این کار بهتره از هیچیه
اگه میشه طریقه به دست اوردن ماکسیمم ID رو بگید و طریقه قرار دادنش به جای اسم عکس :قلب:

mmd2009
شنبه 12 تیر 1389, 16:08 عصر
طریقه گرفتنش اینطوریه




cmd.commandtext="select max(id) from table1";



البته مگه نگفتید این روش جواب نمیده

حالا چرا از روش دومی که گفتم استفاده نمیکنید؟؟!!:ناراحت:

alasht
شنبه 12 تیر 1389, 16:27 عصر
ببخشید اونو پستو ندیده بودم
اره اینم میشه مثلا اول کد ثبت اطلاعات رو بزارم بعد ماکسیمم ای دی رو بخونه و برای اسم عکس قرار بده ولی معلم نیست جواب بده یا نه باید تست بشه

این کدی هم که شما دادی کار نمیکنه از cmd ایراد میگیره یعنی نمیشناستش

cmd.commandtext = "select max(id) from table1";

من خودم به این صورت نوشتم

private void button1_Click(object sender, EventArgs e)
{
string contodb = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " +
Application.StartupPath + "\\mydb.mdb";
OleDbConnection connect = new OleDbConnection(contodb);
if (connect.State == ConnectionState.Closed) connect.Open();
// max id
string select_search = "SELECT MAX(ID) FROM mytb ";

OleDbDataAdapter dataad_1 = new OleDbDataAdapter(select_search,connect);
DataSet dataset_1 = new DataSet();
dataad_1.Fill(dataset_1, "search");
dataGridView1.AutoGenerateColumns = false;
dataGridView1.DataSource = dataset_1.Tables["search"];

}

ولی عمل نمیکنه یعنی از کد ایراد نمیگیره ولی وقتی رو دکمه کلیک میکنم دیتاگرید ویو که اپدیت میشه فیلدهای خالی نشون میده
مشکل از چیه ؟

mmd2009
شنبه 12 تیر 1389, 16:38 عصر
منظور از cmd همون oledbcommand بود

ولی شما از اداپتر استفاده کردید واسه همین ارور میده

العا تو کد که گذاشتید می خواهید چیکار کنید !!! :متفکر:

اگر می خواهید max ای دی رو حساب کنید دیگه چه کار دارید با گرید ویو

alasht
شنبه 12 تیر 1389, 16:40 عصر
من میخوام ماکس id رو بگیره و تو یه لیبل چاپ کنه یعنی بزرگترین ID رو تو یک لیبل چاپ کنه
چیکار کنم ؟
البته میخوام اینکارو کنم که بفهمم چطوری ماکس بگیرم
اگه یه نمونه بنویسی ممنون میشم :قلب:

mmd2009
شنبه 12 تیر 1389, 16:51 عصر
اینم یک مثال کامل




OleDbCommand cmd = new OleDbCommand();
OleDbConnection con = new OleDbConnection();
string address =@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db.mdb";
con.ConnectionString = address;
con.Open();
cmd.CommandText = "select max(ID) from t1";
cmd.Connection = con;
label1.Text = cmd.ExecuteScalar().ToString();
con.Close();

alasht
شنبه 12 تیر 1389, 17:01 عصر
:تشویق::تشویق::تشویق::تشویق:
عالی بود مرسی :قلب:

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

alasht
شنبه 12 تیر 1389, 17:28 عصر
دم همتون گرم از اون اول تا این اخر :لبخند:
اقا نصفه درست شد ! :لبخند:
یعنی ایدی رو میخونه و طبق اون اسم عکسو عوض میکنه
کدشم اینه

File.Copy(txtadres.Text, Application.StartupPath + "\\Image\\" + cmd.ExecuteScalar().ToString() + Path.GetExtension(txtadres.Text), true);

ولی همون مشکل که راجع بهش بحث میکردیمو داره یعنی یه شماره عقبه من برای ورود اطلاعات و عکس دو تا کانکشن جدا ساختم یعنی اول اطلاعات وارد میشه و از دیتابیس خارج میشه و بعد دوباره دیتابیس وصل میشه و عکسو سیو میکنه ولی در هردو صورت بزرگترین id میشه همون id قبلیمون یعنی من اگه بخوام یوزر شماره 14 رو ذخیره کنم عکسش میشه

13.jpg
من میتونم با یک +1 درستش کنم ولی در موارد خاص که قبلا گفتم به مشکل برمبخوریم
راهی نیست دوستان ؟

mmd2009
شنبه 12 تیر 1389, 17:31 عصر
میشه کد کاملتون که که گذاشتید بذارید اینجا تا ببینیم ایرادش چیه ؟

alasht
شنبه 12 تیر 1389, 17:44 عصر
خدمت شما :قلب:


private void btnimport_Click(object sender, EventArgs e)
{
/////////////////////////////////////////////////////////////////////////////////////////
string contodb = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " +
Application.StartupPath + "\\mydb.mdb";
OleDbConnection connect = new OleDbConnection(contodb);
if (connect.State == ConnectionState.Closed) connect.Open();
string StrSql = "INSERT INTO mytb (nam,famil,nampedar,sen)" +
" values('"+txtname.Text+"','"+txtfamil.Text+"','"+txtpedar.Text+"','"+txtsen.Text+"')";
OleDbCommand mycommand = new OleDbCommand();
mycommand.CommandText = StrSql;
mycommand.Connection = connect;
mycommand.ExecuteNonQuery();
OleDbCommand cmd = new OleDbCommand();
OleDbConnection con = new OleDbConnection();
con.Close();
//////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////
string contodb2 = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " +
Application.StartupPath + "\\mydb.mdb";
OleDbConnection connect2 = new OleDbConnection(contodb2);
if (connect2.State == ConnectionState.Closed) connect2.Open();
con.ConnectionString = contodb;
con.Open();
cmd.CommandText = "select max(ID+1) from mytb";
cmd.Connection = con;
File.Copy(txtadres.Text, Application.StartupPath + "\\Image\\" + cmd.ExecuteScalar().ToString() + Path.GetExtension(txtadres.Text), true);
con.Close();
//////////////////////////////////////////////////////////////////////////////////////////

///Grid view update
string select = "select * From mytb";
OleDbDataAdapter dataad_1 = new OleDbDataAdapter(select,connect);
DataSet dataset_1 = new DataSet();
dataad_1.Fill(dataset_1, "tb2");
dataGridView1.AutoGenerateColumns = false;
dataGridView1.DataSource = dataset_1.Tables["tb2"];
}

mmd2009
شنبه 12 تیر 1389, 17:53 عصر
العا این کد درسته و نیازی به id+1 نیست فقط همون id باید جواب بده!!!


و البته اینم بگم چرا اینقدر تکرار کد نویسی داری؟؟!!!!

alasht
شنبه 12 تیر 1389, 18:14 عصر
العا این کد درسته و نیازی به id+1 نیست فقط همون id باید جواب بده!!!نه جواب نمیده برنامه رو ضمیمه کردم لطفا دانلود کنید ببینید میتونید درستش کنید
من گرفتم id رو بهم ریختم یعنی چند تا کاربر وارد کردم بعد حذفش کردم الان دو تا کاربر تو دیتابیس هست که شمارهاشون 1 و 2 هست اگه شما یه کاربر اضافه کنی شمارش میشه 16 ولی شماره عکسش میشه 2
خودتون تست کنید متوجه میشید . عکسها هم تو این مسیر ذخیره میشه

myprogram\bin\Debug\image
و البته اینم بگم چرا اینقدر تکرار کد نویسی داری؟؟!!!!دیگه تکرار نمیشه :خجالت:

alasht
شنبه 12 تیر 1389, 18:46 عصر
اقا درستش کردم
ممنون از دوستان که راهنماییم کردن
با تشکر فراوان :قلب: