如何从DataSet向我的WPF添加新文本框?

时间:2013-11-06 13:24:35

标签: c# wpf linq

好的,所以我正在尝试创建一个wpf,其中屏幕上的文本框数量与DataTable中符合特定条件的行数相关。我希望根据表中的数据填充TextBoxes。

我尝试了什么1)

int numContacts = 0;
List<TextBox> list = new List<TextBox>();

IEnumerable<DataRow> selectedContacts = from myRow in 
   ds.Tables["contacts"].AsEnumerable()
   where myRow.Field<int>("company_ID") == 1
   select myRow;

try
{
    foreach (var item in selectedContacts)
    {
        list.Add(new TextBox());
        // Here Is where I would like to setup the text box
        // I'm not quite sure how I would do that though
        numContacts++;
    }
}
catch {}

基本上我想设置这样的属性:

TextBox[,] tb = new TextBox[numContacts, 3];
var width = txt_name.Width;
var height = txt_name.Height;
Thickness marginName = txt_name.Margin;

for (int i = 0; i < nametb.GetLength(0); i++)
{
    tb[i, 0] = new TextBox();
    tb[i, 0].HorizontalAlignment = HorizontalAlignment.Left;
    tb[i, 0].VerticalAlignment = VerticalAlignment.Top;
    tb[i, 0].Name = "name"+i;
    tb[i, 0].Width = width;
    tb[i, 0].Height = height;
    tb[i, 0].Margin = new Thickness(marginName.Left, marginName.Top + (height+3)*(i+1), 0, 0);
    grid.Children.Add(tb[i, 0]);
}

Linq也是最好的选择吗?将来我想创建TextBox然后用每行的信息填充它们,然后最终在用户进行更改时将它们保存回DataTable。

以下是我的DataTable设置方式:

DataSet ds = new DataSet();
DataTable contactTable = new DataTable("contacts");
contactTable.Columns.Add("company_ID", typeof(int));
contactTable.Columns.Add("name");
contactTable.Columns.Add("title");
contactTable.Columns.Add("email");
contactTable.Rows.Add(1, "Jim Bean", "CEO", "Jbean@acompany.ca");
contactTable.Rows.Add(1, "Tim Brown", "CFO", "tbrown@acompany.ca");
contactTable.Rows.Add(1, "Nancy Smith", "CTO", "nsmith@acompany.ca");
contactTable.Rows.Add(2, "Norman Jackson", "CEO", "njackson@bcompany.ca");
contactTable.Rows.Add(3, "Todd White", "CFO", "twhite@ccompany.ca");
ds.Tables.Add(contactTable);

1 个答案:

答案 0 :(得分:2)

所以你以错误的方式接近这个。 WPF的优势在于它能够从您的数据中分离并依赖标记为您呈现数据。这意味着您不应该以编程方式进行任何表示层工作,而应让WPF为您完成工作。这种情况发生在绑定

例如,不是在代码中创建表示对象,而是使用WPF的标记来描述数据:

<DataGrid AutoGenerateColumns="False"
          CanUserAddRows="True"
          CanUserDeleteRows="True"
          ItemsSource="{Binding contacts}">
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding company_ID}"
                        Visibility="Collapsed" />
    <DataGridTextColumn Binding="{Binding name}" />
    <DataGridTextColumn Binding="{Binding title}" />
    <DataGridTextColumn Binding="{Binding email}" />
  </DataGrid.Columns>
</DataGrid>

现在,默认情况下,DataGridTextColumnIsReadonly属性设置为false。这意味着单元格将具有您正在寻找的可编辑功能。由于单元格是绑定的,因此对其值的更改将传播到数据源(如果绑定的属性不是只读的)。

希望这能指出你正确的方向。您还会遇到其他一些细微差别,但我建议您对binding to a DataGrid进行一些研究。

回答你关于LINQ是否是解决这个问题的正确方法的问题 - 我认为如果你在某些DataAccess层中使用LINQ生成类(或 Models )你将绑定你的DataGrid。但是,我认为你必须在LINQ和DataGrid之间做一些工作来处理CRUD