WPF - 填充数据控件,即在另一个控件内部

时间:2009-11-27 15:09:03

标签: wpf controls

我写了一些代码,用数据库中的一些数据填充控件。如果控件直接放在窗口中,一切正常。但是如何填充控件,这些控件位于其他控件中,例如TabControls,GroupBoxes等。 我的代码如下所示:

一些窗口:

private void LoadDataP()
{
    if (ID.Length > 0)
    {
        if (baseButtons.LoadProcedureSelectName != string.Empty)
            LoadData = SqlHelper.GetTable(baseButtons.LoadProcedureSelectName, new string[] { IdName, ID });
        if (LoadData != null)
            foreach (DataRow dr in LoadData.Rows)
            {
                SqlHelper.FillWindowControllsWithData(myGrid, dr);
            }
    }

}

另一个班级有方法。他们做主要工作:

public static void FillWindowControllsWithData(Grid windowGrid, DataRow dataRow)
{
    foreach (Control ctrl in windowGrid.Children)
    {
        FillWindowControllsWithData(ctrl, dataRow);
    }
}

public static void FillWindowControllsWithData(Control ctrl, DataRow dataRow)
{
    if (ctrl.Name.IndexOf("db_") == 0)
    {
        if (ctrl is TextBox)
        {
            if (dataRow.Table.Columns.Contains(ctrl.Name.Substring(3)))
            {
                ((TextBox)ctrl).Text = dataRow[ctrl.Name.Substring(3)].ToString();
            }
        }
    } //end if

}

那么有没有人知道如何在texbox中填充数据,这是在某个groupbox或tabcontrol中,也有子代...?

2 个答案:

答案 0 :(得分:2)

只是为了扩大Dabbleml的说法:使用Windows Forms技术编写WPF应用程序是走向绝望和痛苦的道路。构建WPF应用程序的快乐,快乐和自由的方式是通过MVVM模式和数据绑定。

流行语使这个声音比它实际上要难得多。在实践中,它在概念上非常简单:

  1. 设计WPF窗口。这是你的观点。

  2. 构建一个类,该类公开您的窗口将显示为属性的每个数据。这是您的视图模型。向从数据源填充它的类添加方法。 (顺便说一句,这是你的模型。现在你可以说你正在使用MVVM模式并在派对上给女孩留下深刻的印象。)

  3. 在WPF窗口中创建一个数据上下文,该窗口将包含此类的实例,并将控件绑定到类的属性。

  4. 执行此操作时会发生什么:您编写的实际代码都涉及操纵数据,而不是UI。当有人来找你并询问你的窗户是否会出现某种奇怪的情况时会出现某种舞蹈博洛尼亚,你就不会写任何UI代码;您只需在视图模型中添加一个属性,并将视图中的dancing-bologna控件绑定到它。

答案 1 :(得分:1)

我认为你可以递归地编写FillWindowControllsWithData方法。您需要更改方法的签名:

public void FillWindowControllsWithData(FrameworkElement element, DataRow dataRow)
{
    if (element is TextBox) 
   {
        if (element.Name.StartsWith("db_")
        {
            if (dataRow.Table.Columns.Contains(element.Name.Substring(3)))
            {
                ((TextBox)element).Text = dataRow[element.Name.Substring(3)].ToString();
            }
        }
    } 
     else if(element is Panel)
    {
       foreach(FrameworkElement el in ((Panel)element).Children)
       {
          FillWindowControllsWithData(el, dataRow);
       }
    }
    else if(element is ContentControl)
    {
      FillWindowControllsWithData(((ContentControl)element).Content, dataRow);
    }
    //else do nothing
}

然而,这肯定不是这样做的方法。您需要通过数据绑定来填充控件。开始here开始。祝好运!