C# 获取多个生成控件的值

C# 获取多个生成控件的值,c#,wpf,C#,Wpf,我有一个数据库,例如有3列 ID(int)、名称(Varchar)、日期(Datetime) 比方说,我想通过我的应用程序向这个数据库中添加一行,并且我想为不同的数据类型使用不同的控件。 所以对于ID我想要一个带有上/下箭头的文本框。对于name一个简单的文本框,对于Date一个日期选择器 这很简单,我将数据库中的SchemaTable调用到一个循环中,并生成一个if语句来检查DataType=System.String还是System.DateTime或System.Int32 就这样 现在,

我有一个数据库,例如有3列

ID(int)、名称(Varchar)、日期(Datetime)

比方说,我想通过我的应用程序向这个数据库中添加一行,并且我想为不同的数据类型使用不同的控件。 所以对于
ID
我想要一个带有上/下箭头的文本框。对于
name
一个简单的文本框,对于
Date
一个日期选择器

这很简单,我将数据库中的SchemaTable调用到一个循环中,并生成一个if语句来检查DataType=
System.String还是System.DateTime或System.Int32

就这样

现在,当我按enter键时该怎么办?控件是动态添加的,所有控件都具有不同的属性。但我需要它们的值,将其保存到数据库中

我的想法是,通过控件
Content属性
循环并获取值。 但许多控件具有不同的内容属性。 例如,日期选择器具有框+拾取图标

你们怎么解决这个问题

如果它们都是文本框(目前是),我可以通过以下代码从所有文本框中获取文本属性:

List<TextBox> textboxes = new List<TextBox>();
textboxes = sp.Children.OfType<TextBox>().ToList();
string query = "INSERT INTO " + myTable + " (";

for (int i = 0; i < textboxes.Count; i++)
{
    if (i < textboxes.Count - 1)
        query += textboxes[i].Name + ",";
    else
        query += textboxes[i].Name;
}

query += ") VALUES (";

for (int i = 0; i < textboxes.Count; i++)
{
    if (textboxes[i] == null)
    {
        textboxes[i].Text = "0";
    }

    if (i < textboxes.Count - 1)
        query += "'" + textboxes[i].Text + "',";
    else
        query += "'" + textboxes[i].Text + "')";
}
List textboxs=新列表();
textboxs=sp.Children.OfType().ToList();
string query=“插入“+myTable+”(”;
对于(int i=0;i
但是现在不行了,因为每次都可以更改不同的控件,所以它们从来都不是静态的,我必须生成控件

这是我如何添加控件的代码(仅显示DatePicker和normal文本框以便更好地理解)

foreach(schemaTable.Rows中的DataRow字段)
{
if(field.field(“ColumnName”)!=“id”)
{
if(字段[“数据类型”].ToString()=“System.DateTime”)
{
DatePicker DatePicker=新的日期选择器();
MaterialDesignThemes.Wpf.hintasist.SetHint(日期选择器,
大写字母优先(field.field(“ColumnName”));
MaterialDesignThemes.Wpf.hintasist.SetIsFloating(datePicker,true);
datePicker.Margin=新厚度(5);
datePicker.Name=field.field(“ColumnName”);
datePicker.Tag=field.field(“AllowDBNull”);
sp.Children.Add(日期选择器);
}
其他的
{
TextBox TextBox=新建TextBox();
MaterialDesignThemes.Wpf.hintasist.SetHint(文本框,大写字母优先(field.field(“ColumnName”));
MaterialDesignThemes.Wpf.hintasist.SetIsFloating(textBox,true);
文本框。边距=新厚度(5);
textBox.Name=field.field(“ColumnName”);
textBox.Tag=field.field(“AllowDBNull”);
sp.Children.Add(文本框);
}
}
}

不清楚。如果您有3列且ID为增量,请使用以下代码:

foreach (var row in textboxes )
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {

        string saveQuery = "INSERT into " + myTable+ " (name, date) VALUES (@name, @date)";
        using (SqlCommand querySave = new SqlCommand(saveQuery))
        {
            querySave.Connection = connection;

            querySave.Parameters.Add("@name", SqlDbType.VarChar, 255).Value = (row == null) ? 0 : row.Text;
            querySave.Parameters.Add("@date", SqlDbType.DateTime).Value = DateTime.Now;

            connection .Open();
            querySave.ExecuteNonQuery();
            connection .Close();

        }
    }
}

您已经使用MVVM模式了吗?无论你想用WPF做什么,这都是一个很好的起点,WPF相关问题的大多数好答案都是基于MVVM的——因此,如果你还不知道/使用它,你应该开始学习它。是的,我在学习MVVM方面总是失败。等待一个在mvvm模式上工作的家伙,因为他将为此制作一些教程。所以,是的,但没有我工作的代码背后。我不明白这在mvvm中是如何工作的,因为在mvvm中,你是否必须编写属性代码?我没有相同的属性,因为我的数据库中可以有1列或2或10列。这不像“我永远都有这个这个这个”。因此,我无法生成“静态”属性(对于静态属性,我的意思是它们是硬编码的,而不是静态属性)".承认,MVVM不会神奇地为您完成这项工作。但它可以帮助您分离关注点。您可以专注于将您的可模式查询转换为应用程序中的数据模型,然后将您的数据模型转换为insert语句,您可以单独专注于显示您的数据模型-这只是解决问题的一个机会一步一步地初始化,而不是在一个庞大的复杂过程中从数据库转到用户界面。您是否尝试过创建自己的控件,鉴于数据库行将创建内部控件和处理值等等?MVVM在这种情况下会有很大帮助,因为您可以为在列表中传递的每种类型的对象使用组件,并且odel将由这些控件自己通过数据绑定进行更新。但是,您可以使用纯数据绑定和智能控件来实现这一点,智能控件将为每种类型的数据创建it编辑器,而不知道您的应用程序以及为什么要生成控件-您不能在生成控件时创建控件列表并遍历h使用GetType()检查类型的列表。我完全同意OP应该使用
SqlParameter
,而不是将值构建到命令中,但我认为这个答案缺少了问题中提到的很多东西(为不同的数据类型处理不同类型的控件)请更清楚地解释场景…例如,您创建了可以包含动态元素的“Windows窗体应用程序”?然后您需要保存其数据?您有
foreach(文本框中的var行)
问题是,我并不是只有文本框。我有DatePicker等,需要它们的值。我编辑代码如何生成控件。也许你会了解更多。
foreach (var row in textboxes )
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {

        string saveQuery = "INSERT into " + myTable+ " (name, date) VALUES (@name, @date)";
        using (SqlCommand querySave = new SqlCommand(saveQuery))
        {
            querySave.Connection = connection;

            querySave.Parameters.Add("@name", SqlDbType.VarChar, 255).Value = (row == null) ? 0 : row.Text;
            querySave.Parameters.Add("@date", SqlDbType.DateTime).Value = DateTime.Now;

            connection .Open();
            querySave.ExecuteNonQuery();
            connection .Close();

        }
    }
}