好的,所以我正在尝试创建一个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);
答案 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>
现在,默认情况下,DataGridTextColumn
将IsReadonly
属性设置为false
。这意味着单元格将具有您正在寻找的可编辑功能。由于单元格是绑定的,因此对其值的更改将传播到数据源(如果绑定的属性不是只读的)。
希望这能指出你正确的方向。您还会遇到其他一些细微差别,但我建议您对binding to a DataGrid进行一些研究。
回答你关于LINQ是否是解决这个问题的正确方法的问题 - 我认为如果你在某些DataAccess层中使用LINQ生成类(或 Models )你将绑定你的DataGrid。但是,我认为你必须在LINQ和DataGrid之间做一些工作来处理CRUD。