Tuesday, March 31, 2009

Create datatable from multi select rows C#

ออกรายงานจาก Datatable ที่สร้างจาก multi select row ใน datagridview

# ประเด็นมีอยู่ว่าต้องการออกรายงานด้วย crystal report ซึ่งจะเอาข้อมูลใน datagridview ที่เลือก



# ติดไว้ตั้งแต่เมื่อวานเพราะ ข้อมูลที่แสดงผิดอ่ะดิ เป็นตัวเลขหมดซะงั้น



# ซึ่งความจริงแล้ว CustomerID จะเป็นชื่อ อักษรภาษาอังกฤษอ่ะดิ แต่ไมขึ้นตัวเลขแบบนี้หว่า

# debug ดูไงว่า CustomerID expected int32 ว่า



# can not store ผิดตรงใหนหว่า่

# นี้คือโค้ดตอนสร้าง datatable ที่แล้วการสร้างเพิ่ม colum ซึ่งเอามาจาก
datagridview อีกที

DataTable dt = new DataTable();

for (int i = 0; i < dgvSearchResult.Columns.Count; i++)
{
DataColumn column = new DataColumn();
column.DataType = dgvSearchResult.Columns[i].GetType();
column.ColumnName = dgvSearchResult.Columns[i].Name;
column.AutoIncrement = true;
dt.Columns.Add(column);
}


// dgvSearchResult คือ Datagridview
// bindingSourceSearchResult.DataSource = dtsTableData.Tables[0];
// มันเป็นงี้ dgvSearchResult.DataSource = bindingSourceSearchResult

// โค้ดนี้สำหรับเพิ่มค่าให้ row แต่ละ cell เนี๋ย ถูกแหละ คิดว่ามันผิดตรงใหนอยู่ตั้งนานเซงมากๆ

for (int i = 0; i < dgvSearchResult.SelectedRows.Count; i++)

{
DataRow dr = dt.NewRow();

for (int j = 0; j < dt.Columns.Count; j++)
{
Object obj = dgvSearchResult.SelectedRows[i].Cells[j].Value;
dr[dt.Columns[j].ColumnName] = obj;

}

dt.Rows.Add(dr);

}
# นั่งแก้มั่วไปเรื่อยอยู่เป็นวัน ตูก็เอา column จาก datagridview เลยนะสำหรับกำหนดคุณสมบัติให้ column ใหม่

# แล้วทำไม type ของ column ตูจะผิดได้ไงหว่า เป็น int32 หมดซะงั้น


# หรือว่าตูเพิ่มค่าให้กับ datarow ผิดหว่า คิดไปเรื่อย แก้ไปเรื่อย เมื่อวานนั่งงมใน google ตั้งนาน ก็เจอยู่นะแต่ไม่ได้ get อาไรกับเค้าเล้ย กับห้องไปนอนดีกว่า


# วันนี้ ตื่นขึ้นมา ล้างหน้า แปลงฟัน อาบน้ำ สดชื่นอย่างแรก เปิด nb แล้วก็นั่งดูในเว็บ codeproject ที่เมื่อวานนั่งดูไม่ get อาไรเลย

# ลองใหม่อีกครั้งน่า ความพยายามอยู่ในความสำเร็จก็อยู่นั่นอ่ะดิครับ วันที่รอคอยก็มาถึง


# สร้าง Datatable จาก multi select row ใน Datagridview ได้แหละ


# ปัญหาที่เราสร้าง datacolumn ผิดหว่าเพราะ datagridview ไม่ได้ผูกกับ dataset โดยตรง เพราะ เราใช้ bindingSource ผูกกับ dataset หรือ datatable แล้วค่อยนำ datagridview ไปผูกกับ bindingSource อีกรอบ

# ที่ทำอย่างนี้เพราะว่าจะทำ paging ให้ datagridview เราอ่ะนะ เลยต้องใช้ databinding มาเกี่ยวข้องอีกที่ เพราะปกติ ใช้ datagridview ผูกกับ dataset หรือ datatable เลยตลอด


# ทำให้ตอนสร้าง column ได้ datatype ผิดๆ อ่ะ ^^'


# ถ้าเราต้องการสร้าง Datatable ใหม่โดยต้องการนำ column ใน Datagridview ที่ผูกกับ bindingSource เราต้องเข้าถึง bindingSource โดยตรง และใช้ dataview มาเกี่ยวข้องด้วยหว่า ซึ่งเป็นอาไรที่เรา ไม่เคยใช้มาก่อนเลย

# จากโค้ดด้านบนให้เราแก้เป็น

// ก็ใช้แบบนี้ไม่ได้อ่ะนะ bindingSourceSearchResult.Columns

// dgvSearchResult คือ Datagridview
// bindingSourceSearchResult.DataSource = dtsTableData.Tables[0];
// มันเป็นงี้ dgvSearchResult.DataSource = bindingSourceSearchResult

DataTable dt = new DataTable();

CurrencyManager cm =
(CurrencyManager)dgvSearchResult.BindingContext[bindingSourceSearchResult.DataSource
, bindingSourceSearchResult.DataMember];

DataView dv = (DataView)cm.List;

foreach (DataColumn dc in dv.Table.Columns)
{
dt.Columns.Add(dc.ColumnName);
}



# ใหนๆ ก็ไปยุ่งกับ Dataview เสริมอีกหน่อยเรื่องการจัดเรียงข้อมูลใน datatable อันนี้เอามาจาก ที่นี้ เพื่อจะได้เรียงข้อมูลได้ เพราะ ถ้าเราเลือกจากบนลงล่าง เมื่อออกรายงานจะ เรียงจากมากไปน้อยซะงั้น

// dt คือ DataTable
DataView v = dt.DefaultView;
//v.Sort = "sumaccept DESC, suminvite DESC, emailaddress ASC";
v.Sort = "rank ASC";
dt = v.ToTable();

# หรืออยากให้เรียงใหม่ ตอนเรา add ข้อมูลให้ datarow เราก็สลับ index สิครับ

// ของเดิม
//for (int i = 0; i < dgvSearchResult.SelectedRows.Count; i++)

// กลับกันก็
for (int i = (dgvSearchResult.SelectedRows.Count - 1)
; i >= 0; i--)
# เราก็สามารถออกรายงานให้เรียงเหมือนใน DatagridView ได้แล้ว ^^' (อย่าลืม comment dataview sort)

# แต่ทำไมเรา sort แหละยังเรียงงี้อ่ะ 10, 11 ต่อ 1 ซะงั้น น่าจะเป็น 2 มากว่า 10 , 11 นะ ทำไมเรียงแบบ string ซะงั้น แล้วตูจะทำไงล่ะที่นี้

# แก้แบบใส่ type ก่อน add ลง table ตามลิ้งนี้บอกแล้วนะ แต่ไม่ผ่านหว่า มันเป็นการเปลี่ยน type ของ datatable ที่มีข้อมูลอยู่แล้วซะงั้น

dc.DataType = typeof(int);

# ของเดิม
dt.Columns.Add(dc.ColumnName);

# ให้เราแก้บรรทัดที่ใส่แต่ column name ให้เติม type ของ column เนี๋ยลงใน datable ตัวใหม่ด้วยซะงั้น

dt.Columns.Add(dc.ColumnName, dc.DataType);

# จากที่แก้แล้วใช้ได้ เรียงแบบ integer ได้ถูกต้องแหละ สรุปได้ว่า ถ้าเราไม่ใส่ type ตอนเพิ่ม column ให้ table ค่าโดยปริยายจะเป็น string หว่า


References :


No comments:

Post a Comment

Popular Posts