ขอความกรุณา เรื่องการแสดงข้อมูลใน DataGrid เรียงข้อมูลจากน้อยไปมาก และนับข้อมูลที่ซ้ำกันครับ
ทำใน datatable
sort dataview ของ datatable1 แล้ว convert กลับเป็น datatable1 อย่างเดิม
สร้าง datatable2 ขึ้นมาอีกอัน แล้ว add column 2 อัน คือ data กับ count เป็น integer
วนลูป datarow ของ datatable1 โดยเป็นค่า previous กับ current row ไว้เปรียบเทียบ
ลูปแรก previous = null --> ให้เก็บค่า data ไว้ แล้ว ให้ count = 1
ต่อไปถ้า previous ไม่เท่ากับ current --> ให้เอา data และ count ใน previous มาใช้แล้ว add new row ให้กับ datatable2 จากนั้นให้เอาค่าจาก current จากแทนใน data แล้วให้ count = 1
ต่อไปถ้า previous เท่ากับ current --> ให้ data คงเดิมแต่ count + 1 แล้ววนลูปต่อไป
ทำจนหมด row จากนั้นก็เอา datatable2 ที่ได้ใหม่ ไป bind ให้ datagridview แสดงผล
Date :
2010-12-21 20:05:05
By :
ตังค์แมน
งานลักษณะนี้น่าจะเหมาะกับ LINQ (Language-Integrated Query)
เคยได้ยินชื่อแต่ไม่เคยนำมาใช้งาน
ไม่รู้ว่าจะใช้ LINQ กับ DataTable ได้รึเปล่า (แต่ในความรู้สึกส่วนตัว ผมคิดว่า LINQ มันเกิดมาเพื่อการนี้)
ต้องให้ผู้มีประสบการณ์กับ LINQ มาตอบ
แต่เบื้องต้น ก็ทำอย่างตังค์แมนไปก่อนล่ะกัน
Date :
2010-12-22 09:58:51
By :
หางอึ่ง
ทำไมไม่ใช้ Group By ใน SQL ก่อนละครับ น่าจะง่ายกว่าเยอะเลย
Date :
2010-12-22 10:19:47
By :
zero1150kfc
เจ้าของกระทู้ยังเงียบ ห้าๆๆๆๆ
Date :
2010-12-22 11:15:10
By :
zero1150kfc
Code (C#)
int data;
int count;
int dataprevious;
int countprevious;
//ตัวแปร
private void button1_Click_1(object sender, EventArgs e)
{
int _row = dataGridView1.Rows.Count;
DataView view = new DataView();
view = dt.DefaultView;
view.Sort = "f1";
DataTable data1 = new DataTable();
data1 = dt;
DataTable data2 = new DataTable();
DataColumn dc1 = new DataColumn("Data",typeof(int));
DataColumn dc2 = new DataColumn("Count", typeof(int));
data2.Columns.Add(dc1);
data2.Columns.Add(dc2);
for (int i = 0; i < _row; i++)
{
//
string previous = dataGridView1.Rows[i].Cells[0].Value.ToString();
string current = dataGridView1.Rows[i].Cells[0].Value.ToString();
//
if (previous == null)
{
dataprevious = Convert.ToInt32(previous);
countprevious = 1;
}
if (previous != current)
{
data = dataprevious;
count = countprevious;
data2.Rows.Add(data,count);
data = Convert.ToInt32(current);
count = 1;
}
if (previous == current)
{
data = dataprevious;
count++;
}
}
dataGridView2.DataSource = data2;
int Rcount = dataGridView2.Rows.Count;
label8.Text = Convert.ToString(Rcount);
}
เมื่อคืนผมนั่งลองเขียนแต่ก็ ไม่ได้ผลลัพท์ดังใจ ผมเข้าใจแนวคิดของคุณตังค์แมนนะครับ
แต่ Coding ผม ไม่เอาไหนเอาซะเลย TT_TT รบกวน ช่วยแนะแนวผมด้วยนะครับ ทุกท่าน
ขอบคุณมากครับ
Date :
2010-12-22 12:00:30
By :
noompd
ดีๆ อยากกด like ให้จริงๆ ฝึกเยอะๆ จะได้เก่งๆ
Date :
2010-12-22 13:08:58
By :
ตังค์แมน
ในลูป จาก if, if, if
ให้เปลี่ยนเป็น if, else if แทน
Date :
2010-12-22 13:12:28
By :
ตังค์แมน
Code (C#)
for (int i = 0; i < _row; i++)
{
string previous = dataGridView1.Rows[i].Cells[0].Value.ToString();
for (int j = 0; j < _row; j++)
{
string current = dataGridView1.Rows[j].Cells[0].Value.ToString();
if (previous == null)
{
dataprevious = Convert.ToInt32(previous);
countprevious = 1;
}
if (previous != current)
{
data = dataprevious;
count = countprevious;
data2.Rows.Add(data, count);
data = Convert.ToInt32(current);
count = 1;
}
if (previous == current)
{
data = dataprevious;
count++;
}
}
}
ผิดพลาดตรงไหนช่วยให้คำแนะนำด้วยนะครับ
Date :
2010-12-22 13:22:47
By :
noompd
Code (C#)
for (int i = 0; i < _row; i++)
{
//
string previous = dataGridView1.Rows[i].Cells[0].Value.ToString();
string current = dataGridView1.Rows[i].Cells[0].Value.ToString();
if (previous == null)
{
dataprevious = Convert.ToInt32(previous);
countprevious = 1;
}
else if (previous != current)
{
data = dataprevious;
count = countprevious;
data2.Rows.Add(data, count);
data = Convert.ToInt32(current);
count = 1;
}
if (previous == current)
{
data = dataprevious;
count++;
}
}
ตัวนี้ลองทำตามที่ คุณตังค์แมนแนะนำครับ
ข้อมูลไม่แสดงผลครับ ต้องขอบคุณ คุณตังค์แมนนะครับที่ช่วยให้คำแนะนำ
Date :
2010-12-22 13:31:34
By :
noompd
โค้ดสด เอาไปลองดู
Code (C#)
private void button1_Click_1(object sender, EventArgs e)
{
int data;
int count;
int dataprevious;
DataView view = new DataView();
view = dt.DefaultView;
view.Sort = "f1";
dt = view.ToTable();
DataTable data2 = new DataTable();
data2.Columns.Add(new DataColumn("data", typeof(int)));
data2.Columns.Add(new DataColumn("count", typeof(int)));
foreach(DataRow dr in dt.Rows)
{
data = int.Parse(dr["data"].ToString()); //<--- ตรงนี้เปลี่ยนเป็นชื่อ column ของใครของมันนะ
if (dataprevious == null)
{
count = 1;
}
else if (dataprevious != data)
{
DataRow drnew = data2.NewRow();
drnew["data"] = dataprevious;
drnew["count"] = count;
data2.Rows.Add(drnew);
count = 1;
}
else if (dataprevious == data)
{
count++;
}
dataprevious = data;
}
//เก็บตก ลูปสุด้ทาย
DataRow drr = data2.NewRow();
drr["data"] = data;
drr["count"] = count;
data2.Rows.Add(drr);
dataGridView2.DataSource = data2;
int Rcount = dataGridView2.Rows.Count;
label8.Text = Convert.ToString(Rcount);
}
Date :
2010-12-22 13:49:13
By :
ตังค์แมน
Code (C#)
int data=0;
int count=0;
int dataprevious=1;
DataView view = new DataView();
view = dt.DefaultView;
view.Sort = "f1";
dt = view.ToTable();
DataTable data2 = new DataTable();
data2.Columns.Add(new DataColumn("data", typeof(int)));
data2.Columns.Add(new DataColumn("count", typeof(int)));
foreach (DataRow dr in dt.Rows)
{
data = int.Parse(dr["f1"].ToString());
if (dataprevious == null)
{
count = 1;
}
else if (dataprevious != data)
{
DataRow drnew = data2.NewRow();
drnew["data"] = dataprevious;
drnew["count"] = count;
data2.Rows.Add(drnew);
count = 1;
}
else if (dataprevious == data)
{
count++;
}
dataprevious = data;
ผลลัพท์ที่ได้ ตามต้องการเลยครับ
ต้องขอขอบคุณคุณตังแมนมากนะครับผม ขอบคุณจริง ๆ ครับ
ผมจะพยายามศึกษาหาความรู้เพื่อพัฒนาตนเอง ให้มากขึ้นครับ
ขอบคุณสำหรับแนวทาง และ Coding ครับ
ประวัติการแก้ไข 2010-12-22 14:20:01 2010-12-22 14:20:39
Date :
2010-12-22 14:09:29
By :
noompd
Load balance : Server 04