PDA

View Full Version : سوال: مشکل در خواندن اطلاعات از DataTable



mehran63
یک شنبه 20 مرداد 1392, 19:48 عصر
سلام
کد زیر اطلاعات رو به درستی از اکسل به DataTable میریزه و در DataGridView به درستی نشون میده
فقط مشکلی که هست اینه که در قسمتی که میخوام با if بررسی کنم در سطر اول ستون اول مقدار اگه فلان بود فلان کار رو بکن این بررسی به درستی انجام نمیشه


private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog of = new OpenFileDialog();
of.Filter = "Excel 2007 Files|*.xlsx";
of.Title = "Open Excel 2007 Files";
DialogResult dr = new DialogResult();
dr = of.ShowDialog();
if (dr == DialogResult.Cancel)
return;

string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;
Data Source= " + of.FileName + " ;Extended Properties=\"Excel 12.0;HDR=No;\"";

string strSQL = "SELECT * FROM [Sheet1$]";

OleDbConnection excelConnection = new OleDbConnection(connectionString);
excelConnection.Open();

OleDbCommand dbCommand = new OleDbCommand(strSQL, excelConnection);
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(dbCommand);

DataTable dTable = new DataTable();
dataAdapter.Fill(dTable);

DataGridView1.DataSource = dTable;
int yCoord = DataGridView1.CurrentCellAddress.X;
int n= dTable.Rows.Count;
if (dTable.Rows[0][0] == "iran")
{

label1.Text = "IRAN";
}
dTable.Dispose();
dataAdapter.Dispose();
dbCommand.Dispose();

excelConnection.Close();
excelConnection.Dispose();

}

parvizwpf
یک شنبه 20 مرداد 1392, 19:52 عصر
الان این dTable.Rows[0][0] چی برمیگردونه؟

mehran63
دوشنبه 21 مرداد 1392, 09:17 صبح
فايل اكسل رو براتون ميزارم
لينك دانلود فايل اكسل (http://uploadtak.com/images/j223_Excel_Worksheet.xlsx)

amir200h
دوشنبه 21 مرداد 1392, 09:34 صبح
listeDaro.Rows[1][0].ToString()=="iran"
البته فکر کنم شما موقعی که میخواین روی دیتاگرید کلیک کردید این شرط چک بشه. درسته؟

mehran63
دوشنبه 21 مرداد 1392, 11:35 صبح
listeDaro.Rows[1][0].ToString()=="iran"
البته فکر کنم شما موقعی که میخواین روی دیتاگرید کلیک کردید این شرط چک بشه. درسته؟
در واقع ميخوام تو كل اين DataTable بگرده و هر جا كه به اون كلمه رسيد يه عملي رو انجام بده
اين كاري كه گفتيد هم جواب نداد

veniz2008
دوشنبه 21 مرداد 1392, 11:59 صبح
سلام.
شرط رو بصورت زیر تغییر بدید. فکر میکنم مشکلتون حل بشه :

if (dTable.Rows[0][0].ToString().Trim() == "iran")
{
label1.Text = "IRAN";
}

amir200h
دوشنبه 21 مرداد 1392, 12:00 عصر
اگه دقیق بگین چی میخواین و چیکار میخواین کنین زودتر بجواب میرسین

mehran63
دوشنبه 21 مرداد 1392, 12:05 عصر
سلام.
شرط رو بصورت زیر تغییر بدید. فکر میکنم مشکلتون حل بشه :

if (dTable.Rows[0][0].ToString().Trim() == "iran")
{
label1.Text = "IRAN";
}

حل شد مشکل همون Trim() بود

mehran63
دوشنبه 21 مرداد 1392, 12:11 عصر
حالا اگه بخوام با یه دستور for کل اون DataTable رو بگردم چه باید کرد؟
همونطوری که در فایل اکسل میبینید دو ستون وجود دارد که اولی نام شهرها است و ستون دوم عددی است که به آن اختصاص داده شده
بر فرض در ستون اول دو بار کلمه "تهران" داریم برنامه باید عدد اونها رو که در ستون دوم هست باهم جمع کنه

mehran6764
دوشنبه 21 مرداد 1392, 12:17 عصر
حالا اگه بخوام با یه دستور for کل اون DataTable رو بگردم چه باید کرد؟

فکر نکنم با یه دستور بشه ، اگر بشه که منم مشتاقم یاد بگیرم
اما می تونین با دو تا حلقه i,j که به سطر و ستون اشاره می کنه
مقادیر رو داخل حلقه بدست بیارین

mehran63
دوشنبه 21 مرداد 1392, 12:30 عصر
حالا با همون دو حلقه چطور این کار رو باید انجام داد؟

esafb52
دوشنبه 21 مرداد 1392, 13:20 عصر
خیلی ساده

int a = 0;
for (int i = 0; i < dTable.Rows.Count -1; i++)
{

if (dTable.Rows[i][0] == "تهران")
{
a += (int)dTable.Rows[i][1];

}


}

mehran63
دوشنبه 21 مرداد 1392, 18:20 عصر
خیلی ساده

int a = 0;
for (int i = 0; i < dTable.Rows.Count -1; i++)
{

if (dTable.Rows[i][0] == "تهران")
{
a += (int)dTable.Rows[i][1];

}


}


به شكل زير درست شد

a += convert.toint32(dTable.Rows[i][1]);
حالا يه مسئله ديگه كه بهش برخورد كردم
بر فرض در يك جا نوشته شده "شمال تهران" در جاي ديگه نوشته شده "تهران" در جايي هم نوشته "تهران جنوب" هر سه اين فيلدها در بررسي كه انجام ميشود يكي هستند.
ولي وقتي در if كلمه "تهران" را بررسي ميكنيم فقط همان كلمه تهران را در بررسي درست ميشناسد و براي كلمات "تهران جنوب" و "شمال تهران" برنامه به خارج از if هدايت ميشود

esafb52
دوشنبه 21 مرداد 1392, 19:20 عصر
دوست عزی باز هم خیلی ساده است از متد کونتین استفاده کن
int a = 0;
for (int i = 0; i < dTable.Rows.Count; i++)
{
string s = dTable.Rows[i][0].ToString();
if (s.Contains("تهران"))
{
a += Convert.ToInt32(dTable.Rows[i][1]);

}


}

مهرداد صفا
دوشنبه 21 مرداد 1392, 20:17 عصر
با سلام.
می توانید برای اینکه مطمئن شوید رشته دوم در رشته اول موجود است از تابع IndexOf (http://msdn.microsoft.com/en-us/library/system.string.indexof.aspx) استفاده کنید.
برای به دست آوردن تعداد تکرار آیتمها از روش تاپیک زیر هم می توانید استفاده کنید:

تابع بیشترین مقدار تکرار (http://barnamenevis.org/showthread.php?373994-%D8%AA%D8%A7%D8%A8%D8%B9-%D8%A8%DB%8C%D8%B4%D8%AA%D8%B1%DB%8C%D9%86-%D9%85%D9%82%D8%AF%D8%A7%D8%B1-%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1-%D8%AF%D8%B1-%DB%8C%DA%A9-%D9%81%DB%8C%D9%84%D8%AF)

mehran63
پنج شنبه 24 مرداد 1392, 11:39 صبح
دوستان متشکر از لطفتون اون مسایل حل شد، ولی یه مسئله دیگه
برنامه رو به شکل زیر نوشتم
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog of = new OpenFileDialog();
of.Filter = "Excel 2007 Files|*.xlsx";
of.Title = "Open Excel 2007 Files";
DialogResult dr = new DialogResult();
dr = of.ShowDialog();
if (dr == DialogResult.Cancel)
return;

string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;
Data Source= " + of.FileName + " ;Extended Properties=\"Excel 12.0;HDR=No;\"";

string strSQL = "SELECT * FROM [QueryExportToExcel$]";

OleDbConnection excelConnection = new OleDbConnection(connectionString);
excelConnection.Open();

OleDbCommand dbCommand = new OleDbCommand(strSQL, excelConnection);
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(dbCommand);

DataTable dTable = new DataTable();
dataAdapter.Fill(dTable);

DataGridView1.DataSource = dTable;

int tehran = 0;
int esfahan = 0;
int shiraz = 0;
for (int i = 0; i < dTable.Rows.Count; i++)
{
string s=dTable.Rows[i][0].ToString().Trim();
if (s.Contains ( "تهران"))
{
tehran += Convert.ToInt32(dTable.Rows[i][1]) * 2;
}
if (s.Contains( "اصفهان"))
{
esfahan += Convert.ToInt32(dTable.Rows[i][1]) * 3;
}
if (s.Contains( "شیراز"))
{
shiraz += Convert.ToInt32(dTable.Rows[i][1]) * 5;
}

}
label1.Text ="امتیاز:"+ (tehran + esfahan + shiraz).ToString();

dTable.Dispose();
dataAdapter.Dispose();
dbCommand.Dispose();

excelConnection.Close();
excelConnection.Dispose();

}
}
فایل Excel مربوط به برنامه (http://www.uplooder.net/cgi-bin/dl.cgi?key=880156266cfe224a1e9bc7981d01f48f)
همانطور که میبینید اطلاعات از یه فایل Excel خوانده شده و در DataTable ریخته میشه و از اونجا برای عملیاتی که نیاز دارم استفاده میکنم
همانطور که در برنامه میبینید به ازای هر شهری که در فایل excel وجود دارد یک If گذاشتم
مشکل ایجاست که اگه یه شهر به این فایل اکسل اضافه بشه اونوقت من باید برنامه رو دوباره تغییر بدم و یه If دیگه هم واسه اون اضافه کنم.
برای رفع این مشکل چه کنم که دوباره برنامه رو تغییر ندم؟