首先,我想道歉,因为我对C#很新。这听起来像是一个愚蠢的问题;但是,我无法在互联网上或在C#上购买的少数几本书中找到任何示例
我有一个表单可以从SQL数据库中获取大量有关负载的数据。 First和Last名称被插入两个单独的组合框中,其中一个将显示信息为“First Last”,另一个显示为“Last,First”,以便于浏览名称。
感谢前几天的一些帮助,我学会了如何使用所选的comboBox值填充单个文本框。再次感谢您的帮助。
我需要做的是当从comboBox中选择用户时,该用户的所有信息都将显示在表单上的某些textBox中。例子是,
LastName = textBox1
FirstName = textBox2
MiddleName = textBox3
我是否需要为每个字段编写单独的字符串,或者是否可以从查询SQL数据库的所有数据的一个字符串中提取该数据?
非常感谢您提供的任何帮助。
这是我到目前为止所拥有的
enter code here
namespace Tempus.Menus
{
public partial class Employees : Form
{
public Employees()
{
InitializeComponent();
//Connect to database for Employees Table Headers
SqlConnection myConnection = new SqlConnection(@"Server=Server4\INSTANCE;Integrated Security=true;" +
"user id=userID;password=password;" +
"Trusted_Connection=yes;" +
"Database=Database;" +
"connection timeout=30");
try
{
myConnection.Open();
string SqlDataPull = String.Format("SELECT * FROM Employees WHERE Lname IS NOT NULL {0}", (checkBox1.Checked ? "AND Active='Y'" : ""));
//string SqlDataPull2 = String.Format("SELECT * FROM Employees WHERE Fname IS NOT NULL {0} ORDER By Fname", (checkBox1.Checked ? "AND Active='Y'" : ""));
SqlCommand cmd = new SqlCommand(SqlDataPull, myConnection);
cmd.CommandType = CommandType.Text;
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
string strEmployee = String.Format("{0} {1}", dr["Fname"], dr["Lname"], dr["Mname"], dr["DOH"], dr["DOT"], dr["Active"], dr["DoNotRehireReason"], dr["PTO-balance"], dr["SNP-balance"], dr["Cred"]);
comboBox1.Items.Add(strEmployee);
string strEmployee2 = String.Format("{0}, {1}", dr["Lname"], dr["Fname"]);
comboBox2.Items.Add(strEmployee2);
int Fname = dr.GetInt32(0);
string firstName = String.Format("{0}", dr["Fname"]);
}
}
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;
}
else
{
textBox1.Text = comboBox1.SelectedItem.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 textBox1_TextChanged(object sender, EventArgs e)
{
}
private void Employees_Load(object sender, EventArgs e)
{
}
private void label1_Click(object sender, EventArgs e)
{
}
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();
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
}
private void textBox3_TextChanged(object sender, EventArgs e)
{
}
private void textBox4_TextChanged(object sender, EventArgs e)
{
}
private void textBox5_TextChanged(object sender, EventArgs e)
{
}
private void textBox8_TextChanged(object sender, EventArgs e)
{
}
private void textBox9_TextChanged(object sender, EventArgs e)
{
}
private void textBox7_TextChanged(object sender, EventArgs e)
{
}
private void textBox10_TextChanged(object sender, EventArgs e)
{
}
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
}
}
}
}
答案 0 :(得分:2)
根据您提供的背景,这是我的反馈。请纳入适用的要点,忽略其余的要点。并希望它也能回答你的问题。
这是一个单层应用程序。建议查看一个分层结构(阅读更多here),这在可维护性,可读性等方面更好。
动态SQL在许多方面被认为是BAD(包括存在安全风险),因此请查看存储过程(或LINQ-to-SQL或任何ORM提供程序)存储的好处。 This文章是一个很好的起点。
您执行SELECT * FROM EMPLOYEE
并阅读10个(可能更多)列,但只使用FName
和LName
列。建议使用类似SELECT FName, LName FROM EMPLOYEE
的内容(在存储过程或等效内容中),并将这些内容填充到数据层中具有相关属性的对象中。在UI层中,您可以进行一次调用以获取数据并将相同的数据绑定到具有适当格式的组合框(一个用空格,另一个用逗号)。
最后,在数据层中有第二个方法来获取给定员工的详细信息(映射到correpsonding属性的所有列?)(比如基于姓氏)。在UI层中,根据组合框中的选定项,您可以获取相应的员工详细信息并将其显示在文本框中。
如果您不想走这条路并想要“快速修复”,请记住该方法效率极低,难以维护且容易出现安全问题。在这里,您只需对组合框中的选定值(使用WHERE
子句)再次进行相同的数据库调用,并将详细信息绑定到文本框。
希望这有帮助。
答案 1 :(得分:2)
我建议创建一个Employee类
class Employee
{
public string firstName { get; set; }
public string middleName { get; set;}
public string lastName { get; set; }
public string fullName { get; set; }
//add other attributes here just the same...
public Employee(string first, string middle, string last, string full)
{
firstName = first;
middleName = middle;
lastName = last;
fullName = full;
//assign ther other attributes..
}
}
您可以在其中创建列表List<Employee> employees = new List<Employee>();
以将返回的SQL数据添加到...
SqlDataAdapter da = new SqlDataAdapter(SqlDataPull, myConnection);
DataSet ds = new DataSet();
da.Fill(ds, "Employees");
foreach (DataRow row in ds.Tables["Employees"].Rows)
{
employees.Add(dr["Fname"], dr["Lname"], dr["Mname"], dr["FullName"]);
}
您可以在sql查询RTRIM(Lname) + ',' + RTRIM(Fname) AS FullName
然后,您可以将列表添加为组合框的dataSource,并引用所选索引以将值添加到文本框中。
答案 2 :(得分:1)
不熟悉使用SQL,但是如果你在组合框中拥有所需的所有信息,那么你可以使用已有的事件。
comboBox1.SelectedIndexChanged + = comboBox1_SelectedIndexChanged; comboBox2.SelectedIndexChanged + = comboBox2_SelectedIndexChanged;
在我看来,comboBox1包含员工的所有信息,而comboBox2只包含名字和姓氏。基于while循环,您可以使用它来填充组合框。
因此,如果用户点击SelectedIndexChanged中comboBox1中的选项,您可以执行以下操作:
if(comboBox1.SelectedIndex != -1)
{
string[]parts = comboBox1.Items[comboBox1.SelectedIndex].ToString().Split(' ');
textBox1.Text = parts[0];//Index for First Name
textBox2.Text = parts[1];//Index for Last Name
textBox3.Text = parts[2];//Index for Middle Name
}
注意:我使用.Split('')将字符串拆分为空格,但是当您从组合框中检索文本时,可以使用分隔不同数据的字符。
不完全确定您要对SQL等做什么,但是如果在从SQL加载后在组合框中有数据,则可以轻松获取数据并将它们放入相应的文本框中而无需从数据库重新加载。
希望这有帮助。