【问题标题】:DataTable not Found error未找到数据表错误
【发布时间】:2023-03-21 00:15:01
【问题描述】:

在对管理数据进行了更多阅读和研究之后,我重新编写了基于 MSDN 站点的数据集代码;但是,我遇到了障碍。我相信我已经在类级别内声明了数据集;但是,每当我尝试使用

提取该数据集时
DataRow[] drRow = tblEmployee.Select("EmployeeKey = " + TextBox12.Text)

我收到错误:

  1. 当前上下文中不存在名称“tblEmployees”
  2. 当前上下文中不存在名称“TextBox12”

我希望能够在类级别声明它,以便可以从表单中的任何位置调用它。

我已经阅读了 MSDN 网站的课程级别,老实说,我认为这让我更加困惑。

基本上我想要发生的是数据集按名字按字母顺序提供员工列表,然后当用户从下拉框中选择员工时,它应该选择员工 ID 并将其显示在 textBox12 中,然后在 tblEmplpoyees 中搜索要为员工显示的剩余数据,例如代码中 //cmets 中定义的字段。

有人可以帮我解决这个问题吗,这是我的代码 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();
    }


}

}

【问题讨论】:

  • 你能把代码粘贴到这里吗?
  • 对不起,我以为我已经从命名空间中选择了所有内容。抱歉。
  • 向我们展示更多代码,尤其是调用和抛出错误的上下文
  • @ChrisTurner - 我仍然没有看到你说错误所在的代码。
  • @Preet Sangha - 第 18 行第 30 列出现错误;但是,在这里它位于代码顶部附近的公共类 myData 中

标签: c# textbox dataset


【解决方案1】:

你在Employees的构造函数中创建了一个局部变量:

DataTable tblEmployees;
tblEmployees = dsEmployees.Tables["Employees"];

现在您正尝试从另一个类中访问该局部变量:

public class myData
{
    DataSet[]drRow = tblEmployees.Select("EmployeeKey = " + TextBox12.Text);;
}

这当然行不通。出于同样的原因,您无权访问表单中的 TextBox12 实例。

我假设您实际上想通过输入的文本过滤DataTable。 您应该处理一个事件,例如(过滤器)按钮单击事件。

然后您可以使用 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 ...
   }
}

【讨论】:

  • 好的,首先我对编程很陌生,所以如果它没有'完全有意义。我道歉。我一直在学习这一点,因为这里没有任何地方提供任何 C# 类。我已经尝试将那行代码放在 textbox12 中,它现在在公共雇员之下。他们都给出了相同的错误。公共类不允许在整个表单中访问数据集还是我误解了这个概念?
  • @ChrisTurner:是的,access modifier 只控制成员或类型的可访问性。这并不意味着您不能在没有实例的情况下访问公共类的成员。
【解决方案2】:

您不能以这种方式初始化 myClass 的 drRow 成员。首先,tblEmployees 变量是一个局部变量,当Employees 构造函数完成时它就不再存在了。所以,没了。但即使它是类成员(在类级别范围内定义),您仍然无法像现在这样使用它。

考虑去掉你的 myData 类,把声明放在和你的Employees类相同的范围级别。

public partial class Employees : Form 
{ 
    DataSet[]drRow;
    public Employees() 
    { 
// etc, etc.

顺便说一句,这也应该解决 TextBox12 上下文问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    相关资源
    最近更新 更多