【问题标题】:How do I loop through DataBindings to add Control.Parse and Control.Format?如何循环通过 DataBindings 添加 Control.Parse 和 Control.Format?
【发布时间】:2011-02-16 15:46:29
【问题描述】:

我对 C# 有点陌生。我有一个带有几十个不同控件(其中许多是 TextBox 控件)的 WinForm。我使用设计器将数据绑定添加到所有这些以在表单加载时获取数据。但是,数据库中的值是加密的。 (它们看起来像这样:“MasAFfa31sdf3fE23AF235==" 当它们看起来像这样时:“Suzy Doe”。)我希望能够向 Format 事件处理程序添加一个方法,以便在每个绑定的数据出现在表单中之前对其进行解密。

我的问题是:如何创建一个循环通过 this.DataBindings 并添加 Format 事件处理程序以在表单显示之前对值进行解密的方法?如何将绑定分配给控件的 DataBinding?

这就是我的想法。

首先,我会在加载方法中调用这个方法:

    private void PatientForm_Load(object sender, EventArgs e)
    {            
        this.tableAdapter.Fill(this.DBDataSet.People);

        UpdateBindings(this);
    }

然后,我会循环遍历 'this' 的控件,将 EventHandler 注册到每个 TextBox 控件:

    private void UpdateBindings(Control controlGroup)
    {
        object controlItem;
        foreach (object controlItemLoop in controlGroup.Controls)
        {
            // Recurse through this control's items and get their bindings...
            controlItem = (Control)controlItemLoop;
            UpdateBindings((Control)controlItem);

            // Update Controls for Data Formatting
            TextBox controlItemTextBox = default(TextBox);
            if (controlItem is TextBox)
            {
                controlItemTextBox = (TextBox)controlItem;
                int i = 0;
                foreach (Binding binding in controlItemTextBox.DataBindings)
                {
                    Binding b = new System.Windows.Forms.Binding(controlItemTextBox.DataBindings[i].PropertyName, controlItemTextBox.DataBindings[i].DataSource, controlItemTextBox.DataBindings[i].BindingMemberInfo.BindingMember, true);

                    // Here, how do I assign a control's Control.DataBindings?
                    // Like this? controlItemTextBox.DataBindings[i] = b;

                    b.Parse += new ConvertEventHandler(BindingParse_TextBox);
                    b.Format += new ConvertEventHandler(BindingFormat_TextBox);
                    i++;
                }
            }
        }
        this.patientsBindingSource.ResetCurrentItem();
    }

那么,当然:

    private void BindingFormat_TextBox(object sender, ConvertEventArgs e)
    {
        // Decrypt
        if (e.DesiredType != typeof(string))
            return;
        if (e.Value.GetType() != typeof(string))
            return;
        string value = 
        try
        {
            e.Value = Decrypt((string)e.Value);
        }
        catch(Exception error)
        {
            MessageBox.Show("A formatting error occurred. Please attempt the operation again.\n\n" + error.Message, "Data Formatting Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return;
        }
    }

我该怎么做?

【问题讨论】:

    标签: c# winforms data-binding


    【解决方案1】:

    如果数据绑定已经存在,您不必为了添加解析调用而重新创建它们:

    foreach (Binding binding in controlItemTextBox.DataBindings)
        {
            binding.Parse += new ConvertEventHandler(BindingParse_TextBox);
            binding.Format += new ConvertEventHandler(BindingFormat_TextBox);
        }
    

    【讨论】:

    • 太棒了!为什么我没看到?!
    猜你喜欢
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    相关资源
    最近更新 更多