繁体   English   中英

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

[英]C# winforms Data bind textboxes to wcf request

我目前正在尝试将来自我的 Customer-Class 的请求解析为一个 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");
            }}

这是Reference.cs的一部分

        public string LastName {
        get {
            return this.LastNameField;
        }
        set {
            if ((object.ReferenceEquals(this.LastNameField, value) != true)) {
                this.LastNameField = value;
                this.RaisePropertyChanged("LastName");
            }
        }
    }

它第一次工作,但第二次编译器说有 2 个绑定(所以我猜我的 DataBindings 不应该在 button_Click 中,而是在 InitializeComponent(); 下)如果我这样做,代码运行但不会更新文本框。 我需要更改什么,以便在我的请求从服务器获取数据后立即更新文本框? 如果属性改变,它应该更新接口。

选项 1 - 快速修复

一个快速的解决方法是在添加新的Binding之前清除DataBindings集合。

选项 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组件进行数据绑定。 您可以在表单上放置一个BindingSource组件,并在设计时将其数据源属性设置为所需的类型。 然后,您将使用设计器获得对数据绑定的设计时支持。 您可以将文本框和标签绑定到该绑定源。 然后在加载数据时,将数据分配给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");                    
            }   
}

关键是要明白我可以只使用我的 servicedata 作为数据源! 感谢 Reza 的大力帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM