1

わかりましたので、画面上のテキストボックスの数が特定の基準に一致する DataTable の行数に関連する wpf を作成しようとしています。テーブルのデータに基づいて 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 はこれに最適なオプションですか? 将来的には、TextBoxes を作成し、各行の情報を入力してから、ユーザーが変更を加えた場合に最終的に 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 がこれにアプローチする正しい方法であるかどうかについての質問に答えるには、 DataGrid をバインドするクラス (またはModels ) を生成するために DataAccess レイヤーで LINQ を使用している場合は問題ないと思います. ただし、 CRUDを処理するには、LINQ と DataGrid の間で何らかの作業を行う必要があると思います。

于 2013-11-06T14:09:38.590 に答える