我已经创建了一个加载crystalreport的类,以便使用来自我的访问数据库的数据加载我的crystal报告。我还有另一个类,其中包含一个表单和文本框,我试图用它们来查询数据库并返回所需的结果纳入我的报告。对于任何意粉代码,我深表歉意,对于这个过程我还是很陌生。我也愿意寻求更好的实施建议。我没有任何错误,但是当我尝试使用'ProviderNumber'(textBox3)文本框中的数据加载水晶报表时,使用数据库中的providernumber时,我会返回0个结果。
第1类(包含提供者编号的文本框)
public partial class Doctor : Form
{
public string PrvNum
{
get { return textBox3.Text; }
set { textBox3.Text = value; }
}
第2类(根据提供者编号生成Crystal报告)
public partial class DoctorLetterPreview : Doctor
{
public void LoadDoctorLetterPreview()
{
Doctor prvNum = new Doctor();
string ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\PathologyWest.accdb";
using (OleDbConnection con = new OleDbConnection(ConnectionString))
using (OleDbCommand Command = new OleDbCommand(" Select * from Doctors where ProviderNumber = @prvNum", con))
{
Command.Parameters.Add("@prvNum", OleDbType.LongVarChar).Value = prvNum.PrvNum;
con.Open();
OleDbDataAdapter da = new OleDbDataAdapter(Command);
DataSet ds = new DataSet();
da.Fill(ds, "Doctors");
MessageBox.Show(ds.Tables[0].Rows.Count.ToString());
con.Close();
DoctorsLetter rpt = new DoctorsLetter();
rpt.SetDataSource(ds.Tables[0]);
crystalReportViewer1.ReportSource = rpt;
crystalReportViewer1.Refresh();
}
}
答案 0 :(得分:2)
据我所知,您正在使用以下方式创建表单的新实例
Doctor prvNum = new Doctor();
,然后立即尝试访问表单的文本框,因为您刚刚创建了表单,所以该文本框为空。
从这里很难说出整个过程是什么样子,但是如果您已经以某种方式打开了该表单并在文本框中键入了值,则应该尝试查找该表单的特定实例并访问该实例
答案 1 :(得分:1)
在方法LoadDoctorLetterPreview()
的最开始,您要创建类Doctor
的新实例,这意味着您要创建新的Form
。如果该表单是新表单,我猜它的TextBox
名为textBox3
是空的。因此,您在第Command.Parameters.Add("@prvNum", OleDbType.LongVarChar).Value
行中将空文本作为参数。
您的方法应该获取现有的Doctor表单的引用,而不是创建新表单,或者应该(如果是这种情况)更改行
Doctor prvNum = new Doctor();
进入
Doctor prvNum = this;
告诉prvNum
实际上是此方法启用的这种形式。