Datagridview利用水晶报表打印问题??!!

ivanho 2010-07-22 09:44:13
如题!

1.如何令Datagridview里的所有内容可以放到水晶报表打印.

2.如何令Datagridview里选定行的内容放到水晶报表打印.(行前可否放一勾选框,凡勾选的,就去打印.Datagridview底下可否有一个"全选")

望大侠们帮帮忙...
...全文
给本帖投票
434 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
东莞寻香苑 2010-07-23
  • 打赏
  • 举报
回复
说的不太清,我还是做个测试的小例子吧,设表classInfo中有两个字段:FBillNo 单号,GetIncQty 数量
DataSet3为三个字段: Checked 布尔值,FBillNo,GetIncQty

DataGridView属性选择:
DataSource:DataSet3 //这里可能会变成dataSet3BindingSource 类似格式
DataMember:classInfo
Columns;中修改你的HeaderText,Width等:

Load事件中绑定数据到DataGridView:

string sConnectionString;
sConnectionString = @" Data Source=HH-LIN\SQL2005;Initial Catalog=test;User ID=sa;Password=411325";
SqlConnection Conn = new SqlConnection(sConnectionString);
Conn.Open();
SqlDataAdapter Customer = new SqlDataAdapter("Select 0 as Checked,FBillNo, GetIncQty From classInfo", Conn);
//红色的为我特意为checkBox设定的默认值,为不选中状态
DataSet3 ds = new DataSet3();
Customer.Fill(ds, "classInfo");
Conn.Close();
Customer.Dispose();
this.dataGridView1.DataSource = ds.classInfo;

按钮中显示选择的项:
DataTable dt = (DataTable)this.dataGridView1.DataSource;
DataRow[] dr = dt.Select("Checked=true");
DataTable dtNew =dt.Clone();//复制一个原表的结构,与DataRow字段与类型相同
for (int i = 0; i < dr.Length; i++)
{
dtNew.ImportRow(dr[i]);
}
CrystalReport2 cr = new CrystalReport2();
cr.SetDataSource(dtNew);
crystalReportViewer1.ReportSource = cr;

-小蕾- 2010-07-23
  • 打赏
  • 举报
回复
在SQL里放一个布尔值我也不懂,但是我想的是可以遍历一下那些checkbox,通过一个布尔标识可以判断并筛选出选中的行。。。例如:
foreach (DataGridViewRow dr in dataGridView1.Rows)
{
if (dr.Cells[0].Value != null)
{
if ((bool)dr.Cells[0].Value == true)
{
int Id = Convert.ToInt32(dr.Cells["ColumnId"].Value.ToString());
string State = dr.Cells["ColumnState"].Value.ToString();
string Fabrication = dr.Cells["ColumnFabrication"].Value.ToString();
if (Fabrication.Equals("否"))
{
MessageBox.Show("未制卡不能登车!");
count = 0;
return;
}
else if (State.Equals("是"))
{
MessageBox.Show("已登车的人不能重复登车!");
count = 0;
return;
}
else
{
list.Add(Id);
count = count + 1;
}
}
}
}
ivanho 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 csui2008 的回复:]
我要你是的话,我会多加一列,里面放一个Checkbox,上面的SQL查询语句我也会加一列放一个布尔值,那样管你选择几行,我都要可以用上面的Select()方法过滤出来,然后传给报表
[/Quote]

前边放一个Checkbox这段会了,但在SQL里放一个布尔值,倒不是很懂...还有就是select()这个条件要相应调整吗?
东莞寻香苑 2010-07-23
  • 打赏
  • 举报
回复
我用的VS2005水晶报表也是自带的
东莞寻香苑 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 ivanho 的回复:]

错误 1 可访问性不一致: 参数类型“WinCR.Form4.datagridviewCheckboxHeaderEventArgs”比委托“WinCR.Form4.datagridviewcheckboxHeaderEventHander”的可访问性低 D:\C_TEMP\WinCR\WinCR\Form4.cs 110 30 WinCR
[/Quote]

那就不知道,我这里完全正常,不过,你可以把它D:\C_TEMP\WinCR\WinCR\Form4.cs的权限(读写)给大点,或datagridviewCheckboxHeaderEventArgs前面的访问不一致(查看一下private,public等)

回到宿舍,在家里电脑下载了,打开也没有事呀

如果不行,把Form4干掉吧,对Form2没有影响


ivanho 2010-07-23
  • 打赏
  • 举报
回复
错误 1 可访问性不一致: 参数类型“WinCR.Form4.datagridviewCheckboxHeaderEventArgs”比委托“WinCR.Form4.datagridviewcheckboxHeaderEventHander”的可访问性低 D:\C_TEMP\WinCR\WinCR\Form4.cs 110 30 WinCR
东莞寻香苑 2010-07-23
  • 打赏
  • 举报
回复
Form2把选中项放入水晶报表中

Form4实现WinForm中DataGridView的全选

你可以把这个两结合起来,就很容易实现全部导出,或部分导出
东莞寻香苑 2010-07-23
  • 打赏
  • 举报
回复
我把自己做传上去了,你去看看http://download.csdn.net/source/2568264
ivanho 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 csui2008 的回复:]
说的不太清,我还是做个测试的小例子吧,设表classInfo中有两个字段:FBillNo 单号,GetIncQty 数量
DataSet3为三个字段: Checked 布尔值,FBillNo,GetIncQty

DataGridView属性选择:
DataSource:DataSet3 //这里可能会变成dataSet3BindingSource 类似格式
DataMember……
[/Quote]

都按以上步骤操作了,还是实现不了....





DataSet ds = new DataSet();
private void REPORTVIEW_Load(object sender, EventArgs e)
{
// TODO: 这行代码将数据加载到表“newDataSet.BFC_CZINFO”中。您可以根据需要移动或移除它。
//this.bFC_CZINFOTableAdapter.Fill(this.newDataSet.BFC_CZINFO);



string sConnectionString;
sConnectionString = @"Data Source=ora;User Id=bfc;Password=dev;";
OracleConnection Conn = new OracleConnection(sConnectionString);
Conn.Open();
OracleDataAdapter Customer = new OracleDataAdapter("Select 0 as Checked,ywid,czxm, sfzhm From BFC_CZINFO", Conn);

//DataSet ds = new DataSet();
Customer.Fill(ds, "BFC_CZINFO");
Conn.Close();
Customer.Dispose();
this.dataGridView1.DataSource = ds.Tables[0];






}

private void button1_Click(object sender, EventArgs e)
{
DataTable dt = (DataTable)this.dataGridView1.DataSource;
DataRow[] dr = dt.Select("Checked=true");
DataTable dtNew = dt.Clone();//复制一个原表的结构,与DataRow字段与类型相同
for (int i = 0; i < dr.Length; i++)
{
dtNew.ImportRow(dr[i]);
}
CrystalReport cr = new CrystalReport();
cr.SetDataSource(dtNew);
crystalReportViewer1.ReportSource = cr;



}



-小蕾- 2010-07-22
  • 打赏
  • 举报
回复
1,想要令Datagridview里的所有内容可以放到水晶报表打印.
必须绑定这些数据到水晶报表。。不是直接绑定Datagridview,而是绑定里面的数据。
2,选几列打印,也是跟前面一个道理,想办法得到这些数据,绑定到水晶报表。都是可以写sql语句的。。

水晶报表打印,具体参考:http://www.51bcw.com/video-html-2206.htm
实现全选的功能还是很简单的。给个例子:
//全选
private void btnAllcheck_Click(object sender, EventArgs e)
{

if (btnAllcheck.Text == "全选")
{
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
//设置每一行的选择框为未选中
dataGridView1.Rows[i].Cells[0].Value = true;
}
btnAllcheck.Text = "取消";
}
else
{
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
//设置每一行的选择框为未选中
dataGridView1.Rows[i].Cells[0].Value = false;
}
btnAllcheck.Text = "全选";
}


}
ivanho 2010-07-22
  • 打赏
  • 举报
回复
对不起,泰哥,忘了说是"WINFORM"
阿泰 2010-07-22
  • 打赏
  • 举报
回复
参考:
http://topic.csdn.net/u/20100525/15/595e7ae8-d9f6-48a3-be65-1c8bcb2dd6a7.html

注意14楼阿林的回复
其实就是把Datagridview中的数据(或选中的数据),重新组合成一个新的datatable,之后就是普通流程了。再传给水晶报表即可
东莞寻香苑 2010-07-22
  • 打赏
  • 举报
回复
我要你是的话,我会多加一列,里面放一个Checkbox,上面的SQL查询语句我也会加一列放一个布尔值,那样管你选择几行,我都要可以用上面的Select()方法过滤出来,然后传给报表
ivanho 2010-07-22
  • 打赏
  • 举报
回复
private void button2_Click(object sender, EventArgs e)
{

string SQL = "select rownum as inum,t.* from (select bfc_clinfo.cphm,hpzl,bfc_czinfo.czxm,bfc_czinfo.sfzhm ,bfc_ywinfo.gxpzlsh ,bfc_clinfo.ccdjrq,bfc_ywinfo.shjg,bz from bfc_clinfo,bfc_ywinfo,bfc_czinfo where bfc_clinfo.ywid=bfc_ywinfo.ywid and bfc_clinfo.ywid=bfc_czinfo.ywid and bfc_ywinfo.lczt='0') t";
SQLOleDb.ExeSqlFillTab(SQL, ref ds,"MyDataSet");

this.dataGridView1.DataSource = ds.Tables[0].DefaultView;

dataGridView1.Columns[0].HeaderText = "序号";
dataGridView1.Columns[0].Width = 25;
dataGridView1.Columns[1].HeaderText = "号码";
dataGridView1.Columns[1].Width = 60;
dataGridView1.Columns[2].HeaderText = "类型";
dataGridView1.Columns[2].Width = 60;
dataGridView1.Columns[3].HeaderText = "名称";
dataGridView1.Columns[3].Width = 60;
dataGridView1.Columns[4].HeaderText = "证件号码";
dataGridView1.Columns[4].Width = 130;
dataGridView1.Columns[5].HeaderText = "待办单编号";
dataGridView1.Columns[5].Width =70;
dataGridView1.Columns[6].HeaderText = "初登日期";
dataGridView1.Columns[6].Width = 80;
dataGridView1.Columns[7].HeaderText = "是否更新";
dataGridView1.Columns[7].Width = 60;
dataGridView1.Columns[8].HeaderText = "备注";
dataGridView1.Columns[8].Width = 205;

}



private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
String SFZHMnr = this.dataGridView1.Rows[e.RowIndex].Cells["sfzhm"].Value.ToString().Trim();
String CZXMnr = this.dataGridView1.Rows[e.RowIndex].Cells["czxm"].Value.ToString().Trim();

DataRow[] dr = ds.Tables[0].Select("sfzhm ='" + SFZHMnr + "' or czxm='" + CZXMnr + "'");
DataTable dt = ds.Tables[0].Clone();//复制一个原表的结构,与DataRow字段与类型相同
for (int i = 0; i < dr.Length; i++)
{
dt.ImportRow(dr[i]);
}

CrystalReport cr = new CrystalReport();
cr.SetDataSource(dt);
crystalReportViewer1.ReportSource = cr;

}


按照"阿林"的方法,我现在做成了一个"基本模式",就是我点哪条,报表就生成那条.

所以现在的方向是:是不是要打一个控件把那些"单击DataGridView"得到的值装起来,再一次倒进报表,让它全部生成呢?
东莞寻香苑 2010-07-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ivanho 的回复:]

private void button1_Click(object sender, EventArgs e)
{


DataSet ds = new DataSet();
MyDataSet md = new MyDataSet();
string SQL = "select rownum as……
[/Quote]

好像这样就没有办法和Gridview联系起来了
建议把Datagridview.DataSource转化为Datatable或dataview(再用ToTble()转成DataTable),设为OldDataTable
然后用阿泰1楼说的,我的方法(处理数据和B/S或C/S没有关系)
DataRow[] dr = OldDataTable.Select(condition);
//condition:你选中时候的某列的状态,如check=true或check='y',即你实际使用的
DataTable dt = OldDataTable.Clone();//复制一个原表的结构,与DataRow字段与类型相同
for (int i = 0; i < dr.Length; i++)
{
dt.ImportRow(dr[i]);
}

CrystalReport cr = new CrystalReport();
cr.SetDataSource (dt);
crystalReportViewer1.ReportSource = cr;
ivanho 2010-07-22
  • 打赏
  • 举报
回复
SQLOleDb.ExeSqlFillTab(SQL, ref ds, "MyDataSet");

这里是通过一个类来把数据放进Dataset里的"MyDataSet"表
ivanho 2010-07-22
  • 打赏
  • 举报
回复
private void button1_Click(object sender, EventArgs e)
{


DataSet ds = new DataSet();
MyDataSet md = new MyDataSet();
string SQL = "select rownum as inum,t.* from (select bfc_clinfo.cphm,hpzl,bfc_czinfo.czxm,bfc_czinfo.sfzhm ,bfc_ywinfo.gxpzlsh ,bfc_clinfo.ccdjrq,bfc_ywinfo.shjg,bz from bfc_clinfo,bfc_ywinfo,bfc_czinfo where bfc_clinfo.ywid=bfc_ywinfo.ywid and bfc_clinfo.ywid=bfc_czinfo.ywid and bfc_ywinfo.lczt='0') t";
SQLOleDb.ExeSqlFillTab(SQL, ref ds, "MyDataSet");
CrystalReport cr = new CrystalReport();
cr.SetDataSource (ds);
crystalReportViewer1.ReportSource = cr;


}
阿泰 2010-07-22
  • 打赏
  • 举报
回复
你现在的全部数据是怎么实现的?
代码贴出来看看。

ivanho 2010-07-22
  • 打赏
  • 举报
回复
谢谢...泰哥.

现在数据都转换好了.

但重点问题:

勾选特定行进行打印,还是不能实现.

我的想法是想找一个cheakbox给客户选,选中的就打印,没选不打印...不知是否可行.
阿泰 2010-07-22
  • 打赏
  • 举报
回复

if {A}='04' then
'是'
else
(
if {B}='05' then
'否'
else
'-');

加载更多回复(1)

4,819

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧

手机看
关注公众号

关注公众号

客服 返回
顶部