1

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

我尝试过的 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 是最好的选择吗?将来我想创建文本框,然后用每一行的信息填充它们,然后如果用户进行更改,最终将它们保存回 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);
4

1 回答 1

2

所以你以错误的方式处理这个问题。WPF 的一个优点是它能够与您的数据分离并依靠标记为您呈现数据。这意味着您不应以编程方式执行任何表示层工作,而应让 WPF 为您完成工作。这发生在binding上。

例如,不用在代码中创建表示对象,而是使用 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>

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

希望这会为您指明正确的方向。您还会遇到其他一些细微差别,但我建议您对绑定到 DataGrid进行一些研究。

要回答您关于 LINQ 是否是解决此问题的正确方法的问题——我认为如果您在某些 DataAccess 层中使用 LINQ 来生成您将绑定 DataGrid的类(或Models ),那可能没问题. 但是,我认为您必须在 LINQ 和 DataGrid 之间做一些工作来处理CRUD

于 2013-11-06T14:09:38.590 回答