Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#winforms数据绑定文本框到wcf请求_C#_.net_Winforms - Fatal编程技术网

C#winforms数据绑定文本框到wcf请求

C#winforms数据绑定文本框到wcf请求,c#,.net,winforms,C#,.net,Winforms,我目前正试图将来自客户类的请求解析为winform。 我通过我建立的WCF服务获取内容 以下是Form1代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btn_search_Click(object sender, EventArgs e) { Dictionary<s

我目前正试图将来自客户类的请求解析为winform。 我通过我建立的WCF服务获取内容

以下是Form1代码:

    public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void btn_search_Click(object sender, EventArgs e)
    {
        Dictionary<string, string> dict = new Dictionary<string, string>();  
        int valueParsed;
        if(txt_KNr.TextLength == 6)
        {
            if(Int32.TryParse(txt_KNr.Text.Trim(), out valueParsed))
            {
                Service svc = new Service();
                WcfServiceGVO.CustomerData data = svc.Connect(txt_KNr.Text);
                dict = svc.SplitData(data);
                txt_FirstName.DataBindings.Add("Text", data, "FirstName", false, DataSourceUpdateMode.OnPropertyChanged);
                txt_LastName.DataBindings.Add("Text", data, "LastName");
                txt_Street.DataBindings.Add("Text", data, "Street");
                txt_PLZ.DataBindings.Add("Text", data, "PLZ");
                txt_Location.DataBindings.Add("Text", data, "Location");
                lbl_ampErg.DataBindings.Add("Text", data, "Ampel");
            }}
它第一次工作,但第二次编译器说有2个绑定(所以我想我的数据绑定不应该在按钮中,而是在InitializeComponent()下)
如果我这样做,代码将运行,但不会更新文本框。我需要更改什么,以便在我的请求从服务器获取数据时立即更新文本框?如果属性发生更改,则应更新界面。

选项1-快速修复

快速修复方法是在添加新的
绑定之前清除
数据绑定
集合

选项2-在代码中使用BindingSource

您可以在代码中创建
BindingSource
,并将模型的类型设置为
DataSource
,然后在代码中执行到
BindingSource
的数据绑定。然后在加载数据时,只需将数据分配给绑定源的
DataSource
属性。例如:

private BindingSource bindingSource1 = new BindingSource();
private void Form1_Load(object sender, EventArgs e)
{
    bindingSource1.DataSource = typeof(Model1);
    this.textBox1.DataBindings.Add("Text", bindingSource1, "Property1", true,
                                    DataSourceUpdateMode.OnValidation);
    this.textBox2.DataBindings.Add("Text", bindingSource1, "Property2", true,  
                                    DataSourceUpdateMode.OnValidation);
}

private void button1_Click(object sender, EventArgs e)
{
    bindingSource1.DataSource = GetData();
}
选项3-设计师支持

可以在设计时使用组件进行数据绑定。 您可以在表单上放置
BindingSource
组件,并在设计时将其数据源属性设置为所需的类型。然后,您将使用designer获得数据绑定的设计时支持。您可以将文本框和标签绑定到该绑定源。然后在加载数据时,将数据分配给
BindingSource
DataSource
属性就足够了

更多信息:

  • 特别是这一部分

    • 我遇到的问题是理解我可以将文本框拖放到UI中,以及如何实际使用它。现在它似乎可以工作了,因为我在以前的版本中添加了以下代码:

         private void btn_search_Click(object sender, EventArgs e)
          {
              Dictionary<string, string> dict = new Dictionary<string, string>();  
              int valueParsed;
              if(txt_KNr.TextLength == 6)
              {
                  if(Int32.TryParse(txt_KNr.Text.Trim(), out valueParsed))
                  {
                      Service svc = new Service();
                      WcfServiceGVO.CustomerData data = svc.Connect(txt_KNr.Text);
                      customerDataBindingSource.DataSource = data;
                      //txt_FirstName.DataBindings.Add("Text", data, "FirstName");
                      //txt_LastName.DataBindings.Add("Text", data, "LastName");
                      //txt_Street.DataBindings.Add("Text", data, "Street");
                      //txt_PLZ.DataBindings.Add("Text", data, "PLZ");
                      //txt_Location.DataBindings.Add("Text", data, "Location");
                      //lbl_ampErg.DataBindings.Add("Text", data, "Ampel");                    
                  }   
      }
      
      private void btn\u search\u单击(对象发送者,事件参数e)
      {
      Dictionary dict=新字典();
      int值解析;
      如果(txt_KNr.TextLength==6)
      {
      if(Int32.TryParse(txt_KNr.Text.Trim(),out valueParsed))
      {
      服务svc=新服务();
      WcfServiceGVO.CustomerData=svc.Connect(txt_KNr.Text);
      customerDataBindingSource.DataSource=数据;
      //txt_FirstName.DataBindings.Add(“Text”,数据,“FirstName”);
      //txt_LastName.DataBindings.Add(“文本”,数据,“LastName”);
      //txt_Street.DataBindings.Add(“Text”,数据,“Street”);
      //添加(“文本”,数据,“PLZ”);
      //txt_Location.DataBindings.Add(“文本”,数据,“位置”);
      //lbl_ampErg.DataBindings.Add(“文本”,数据,“Ampel”);
      }   
      }
      

      关键是要理解我可以将我的servicedata用作数据源!感谢Reza提供的巨大帮助!

      第一个选项肯定会解决您的问题。对于第二个选项,请阅读此链接:特别是这一部分,步骤非常简单,只要您将服务引用添加到项目中,它就会将所需类型添加到
      数据中Source
      窗口。您还可以手动将项目添加到窗口中。然后,您甚至可以使用
      CustomerData
      附近的下拉菜单拖动窗口,您可以选择
      Details
      模式,拖动
      CustomerData
      并将其拖放到表单上,您将看到它放置了一个
      BindingSource
      并为您设置数据绑定如果需要,您可以更改它们。然后在运行时获取数据并分配到
      BindingSource
      DataSource
      就足够了。我之前已经尝试了第二种方法,并按照教程进行了操作,但不起作用。它没有更新任何内容:“这将生成样板代码,向用户显示数据存储中产生的数据。[…]如果在应用程序上按F5,则基础数据库中的数据将显示在窗体控件中。”。"我所描述的方法与
      数据源
      完全无关。它与WCF完全相关,并使用您的模型类。我已经多次使用过这种方法,而且它完全可靠且快速。如果您还记得我们使用
      数据集
      的方法,这种方法确实与此类似,但使用的是WCF服务和模型日期答案包含您可以使用的所有选项。所有选项都工作正常,您可以选择其中任何一个。如果您有兴趣自己使用基于代码的配置,则第二个选项适合您。第三个选项对您执行相同的操作,但有设计器支持。第一个选项也是最简单的:)
         private void btn_search_Click(object sender, EventArgs e)
          {
              Dictionary<string, string> dict = new Dictionary<string, string>();  
              int valueParsed;
              if(txt_KNr.TextLength == 6)
              {
                  if(Int32.TryParse(txt_KNr.Text.Trim(), out valueParsed))
                  {
                      Service svc = new Service();
                      WcfServiceGVO.CustomerData data = svc.Connect(txt_KNr.Text);
                      customerDataBindingSource.DataSource = data;
                      //txt_FirstName.DataBindings.Add("Text", data, "FirstName");
                      //txt_LastName.DataBindings.Add("Text", data, "LastName");
                      //txt_Street.DataBindings.Add("Text", data, "Street");
                      //txt_PLZ.DataBindings.Add("Text", data, "PLZ");
                      //txt_Location.DataBindings.Add("Text", data, "Location");
                      //lbl_ampErg.DataBindings.Add("Text", data, "Ampel");                    
                  }   
      }