在对数据管理进行更多阅读和研究之后,我重新编写了基于MSDN站点的数据集代码;但是,我遇到了麻烦。我相信我已经在类级别中声明了数据集;但是,每当我尝试用
拉动数据集时DataRow[] drRow = tblEmployee.Select("EmployeeKey = " + TextBox12.Text)
我收到了错误:
- 当前上下文中不存在名称'tblEmployees'
- 当前上下文中不存在名称“TextBox12”
醇>
我希望能够在类级别声明它,以便我可以从表单中的任何位置调用它。
我已经在课堂上阅读了MSDN网站,老实说,我认为这让我更加困惑。
基本上我想要发生的是数据集按名字提供按字母顺序排列的员工列表,然后当用户从下拉框中选择员工时,它应该选择员工ID并将其显示在textBox12中,然后执行搜索tblEmplpoyees以查找为员工显示的剩余数据,例如在代码中的//注释中定义的字段。
有人可以帮我解决这个问题,这就是我的代码atm:
namespace Tempus.Menus
{
public partial class Employees : Form
{
public class myData
{
DataSet[]drRow = tblEmployees.Select("EmployeeKey = " + TextBox12.Text);;
}
public Employees()
{
InitializeComponent();
//Connect to database for Employees Table Headers
SqlConnection myConnection = new SqlConnection(@"Server=server\CHCTEMPUS;Integrated Security=true;" +
"user id=userID;password=password;" +
"Trusted_Connection=yes;" +
"Database=Database;" +
"connection timeout=30");
SqlDataAdapter daEmployees
= new SqlDataAdapter("Select *, Lname +', '+ Fname as LastFirst, Fname +' '+ Lname as FirstLast FROM Employees WHERE Lname IS NOT NULL AND Fname IS NOT NULL", myConnection);
DataSet dsEmployees = new DataSet("Employees");
daEmployees.FillSchema(dsEmployees, SchemaType.Source, "Employees");
daEmployees.Fill(dsEmployees, "Employees");
DataTable tblEmployees;
tblEmployees = dsEmployees.Tables["Employees"];
comboBox1.DisplayMember = "FirstLast";
comboBox1.ValueMember = "employeeNumber";
comboBox1.DataSource = tblEmployees;
try
{ }
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
finally
{
if (myConnection != null)
{
myConnection.Dispose();
}
}
comboBox1.SelectedIndexChanged += comboBox1_SelectedIndexChanged;
comboBox2.SelectedIndexChanged += comboBox2_SelectedIndexChanged;
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedIndex != -1)
{
textBox1.Text = string.Empty;
}
{
textBox12.Text = comboBox1.SelectedValue.ToString();
}
}
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox2.SelectedIndex == -1)
{
textBox1.Text = string.Empty;
}
else
{
textBox1.Text = comboBox2.SelectedItem.ToString();
}
}
private void Employees_Load(object sender, EventArgs e)
{
}
private void label1_Click(object sender, EventArgs e)
{
}
private void textBox1_TextChanged_1(object sender, EventArgs e)
{
//Last Name
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
//First Name
}
private void textBox3_TextChanged(object sender, EventArgs e)
{
//Middle Name
}
private void textBox4_TextChanged(object sender, EventArgs e)
{
//Hire Date
}
private void textBox5_TextChanged(object sender, EventArgs e)
{
//Term Date
}
private void textBox6_TextChanged(object sender, EventArgs e)
{
//Company
}
private void textBox7_TextChanged(object sender, EventArgs e)
{
//Notes
}
private void textBox8_TextChanged(object sender, EventArgs e)
{
//PTO
}
private void textBox9_TextChanged(object sender, EventArgs e)
{
//SNP
}
private void textBox10_TextChanged(object sender, EventArgs e)
{
//Credentials
}
private void textBox11_TextChanged(object sender, EventArgs e)
{
//Employee Full Name (First Last)
}
private void textBox12_TextChanged(object sender, EventArgs e)
{
//Employee ID
}
private void textBox13_TextChanged(object sender, EventArgs e)
{
//Branch
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (checkBox1.Checked)
{
// logic here for if the box has now been checked
}
else
{
// what to do if the box has been unchecked
}
}
private void button1_Click(object sender, EventArgs e)
{
Main myNewForm = new Main();
myNewForm.Show();
this.Close();
}
private void button2_Click(object sender, EventArgs e)
{
Reports myNewForm = new Reports();
myNewForm.Show();
this.Close();
}
}
}
答案 0 :(得分:0)
您正在Employees
的构造函数中创建一个局部变量:
DataTable tblEmployees;
tblEmployees = dsEmployees.Tables["Employees"];
现在你正试图从wirthin另一个类中访问该局部变量:
public class myData
{
DataSet[]drRow = tblEmployees.Select("EmployeeKey = " + TextBox12.Text);;
}
当然这不起作用。出于同样的原因,您无权访问表单中的TextBox12
实例。
我认为您确实希望按输入的文字过滤DataTable
。
您应该处理一个事件,例如(filter-)按钮单击事件。
然后你可以使用LNQ-To-DataSet,它更易读和可用于过滤行。您可以在表单中将表声明为成员变量,并在form_load中初始化它:
private DataTable tblEmployees;
private void buttonFilter_Click(object sender, System.EventArgs e)
{
if(tblEmployees != null)
{
DataTable filtered = tblEmployees.AsEnumerable()
.Where(r => r.Fields<String>("EmployeeKey") == TextBox12.Text)
.CopyToDataTable();
// do something with it ...
}
}
答案 1 :(得分:0)
您不能以这种方式初始化myClass的drRow成员。首先,tblEmployees变量是一个局部变量,当Employees构造函数完成时,该变量将不存在。所以,它已经消失了。但即使它是类成员(在类级别范围内定义),您仍然无法像使用它一样使用它。
考虑删除myData类,并将声明放在与Employees类相同的范围级别。
public partial class Employees : Form
{
DataSet[]drRow;
public Employees()
{
// etc, etc.
顺便说一下,这也应该解决TextBox12上下文问题。