0

と呼ばれるオブジェクトのコレクションを含むContactsと呼ばれるクラスがありますPhoneNumbers。各PhoneNumbersオブジェクトには、外部キーだけでなく、PhoneNumberを含むいくつかのプロパティがあります。このコレクションをDataGridViewコントロールのデータソースに割り当て、DGVに表示したくない列(プロパティ)を非表示にします。これにより、電話番号とタイプ用のDGVに一連のテキストセル(行/列)が作成されます。テーブルのさまざまな電話タイプすべてが入力された[電話タイプ]列にコンボボックスが表示され、その電話番号のセルに適切な電話タイプが表示されるようにします。オブジェクトのプロパティ と同じコンボボックス列を設計時に追加する必要があることをどこかで読みました。PhoneTypePhoneTypeFKPhoneTypes
DataPropertyNamePhoneNumbersPhoneTypeそのため、DGVに列が入力されると、(PhoneType用に)新しい列を作成する代わりにこの列が使用されます。しかし、これを機能させることはできません。以下のコードを使用して、DGVにデータを入力し、無関係な列を非表示にしました。

//Fill Grid
uxContactPhoneNumbersGrd.DataSource = contacts.PhoneNumbers;

//Hide non-required columns/rows
uxContactPhoneNumbersGrd.RowHeadersVisible = false;
string[] columnNamesToHide = { "ErrMsg", "ContactsFk", "PhoneNumbersPk", "PhoneTypesFk" };
SAPSCommon.Instance.HideGridColumns(ref uxContactPhoneNumbersGrd, columnNamesToHide);

これを行うと、2つの列がPhoneType表示されます。1つはDGVにデータを入力するときに作成されるテキストセルで、もう1つはデザイン時に追加したコンボボックス列です(提案されたものと同じDataPropertyNameがあります)。

の列を1つだけ取得し、それをテーブルPhoneTypeにバインドして、オブジェクトからのデータがそれぞれに正しいPhoneTypeを設定するようにするにはどうすればよいですか?(グリッドにオブジェクトを入力する前に、コンボボックス列を最初にバインドする必要がありますか?)PhoneTypesPhoneNumbersPhoneNumberPhoneTypePhoneNumbers

4

1 に答える 1

1

さて、何時間もの試行錯誤の末、私は解決策を見つけたようです。

基本的なプロセスは次のとおりです。

  1. フォームにDataGridViewコントロールを配置します
  2. グリッドの最初の列をテキストボックス列オブジェクトとして作成し、そのDataPropertyNameをPhoneNumbersオブジェクトのPhoneNumberプロパティ名と同じに設定します
  3. グリッドの2番目の列をcomboxbox列オブジェクトとして作成し、そのDataPropertyNameをPhoneNumbersオブジェクトのPhoneTypeKEYプロパティ名と同じに設定します
  4. コンボボックス列をサポートテーブルにバインドします
  5. グリッドに列を追加します
  6. グリッドのAutoGenerateColumnsプロパティをFalseに設定します
  7. グリッドのデータソースをPhoneNumbersオブジェクトに設定します

グリッド列のDataPropertyNameにPhoneNumberオブジェクトのプロパティ名と同じ名前を付ける理由は、グリッドがPhoneNumberオブジェクトのリストからのデータを正しい列に自動的に入力するためです。AutoGenerateColumnsを無効にすると、指定された列のみが入力されます。つまり、グリッドは、このアプリケーションに必要のないPhoneNumberオブジェクトの他のプロパティの列を自動的に生成しません。

これは、ContactsオブジェクトにPhoneNumberオブジェクトのリストを作成するために使用されるPhoneNumberクラスです。

using System;
using System.Data;
using System.Text;

namespace SAPS
{
public class clsPhoneNumber
{
    #region Fields (4) 

    private int _contacts_FK;
    private string _errMsg;
    private string _phoneNumber;
    private int _phoneNumbers_PK;
    private int _phoneTypes_FK;
    private string _phoneType;

    #endregion Fields 

    #region Constructors (1) 

    public  clsPhoneNumber()
    {
        _errMsg = "";
        _phoneNumbers_PK = 0;
        _phoneTypes_FK = 0;
        _phoneType = "";
        _phoneNumber = "";
        _contacts_FK = 0;
    }

    #endregion Constructors 

    #region Properties (4) 

    public int ContactsFk
    {
        get { return _contacts_FK; }
        set { _contacts_FK = value; }
    }

    public string ErrMsg
    {
        get { return _errMsg; }
        set { _errMsg = value; }
    }

    public string PhoneNumber
    {
        get { return _phoneNumber; }
        set { _phoneNumber = SAPSCommon.Instance.StripNonNumerics(value); }
    }

    public int PhoneNumbersPK
    {
        get { return _phoneNumbers_PK; }
        set { _phoneNumbers_PK = value; }
    }

    public int PhoneTypesFK
    {
        get { return _phoneTypes_FK; }
        set { _phoneTypes_FK = value; }
    }

    public string PhoneType
    {
        get { return _phoneType; }
    }

    #endregion Properties 

    #region Methods (2) 

    // Public Methods (1) 

    /// <summary>
    /// Get the Notes for the specified key
    /// </summary>
    /// <param name="TableID">The Table Primary Key</param>
    /// <returns>An Object containing data for the specified Primary Key</returns>
    public clsPhoneNumber GetData(int TableID)
    {
        AssignProperties(SAPSCommon.Instance.ReadTable("PhoneNumbers", "PN_PhoneNumbers_PK", TableID));
        return this;
    }
    // Private Methods (1) 

    /// <summary>
    /// Assigns the table's data to the properties of the Data Object.
    /// This method must be hand coded for each table.
    /// </summary>
    /// <param name="ds">A Dataset containing the data record read from the Table</param>
    private void AssignProperties(DataSet ds)
    {
        //Assign properties with database data
        try
        {
            //Primary Key for Table
            _phoneNumbers_PK = ds.Tables[0].Rows[0].Field<int>("PN_PhoneNumbers_PK");

            //The rest of the data fields
            _contacts_FK = ds.Tables[0].Rows[0].Field<int>("PN_Contacts_FK");
            _phoneNumber = FormatPhoneNumber(ds.Tables[0].Rows[0].Field<string>("PN_PhoneNum"));
            _phoneTypes_FK = ds.Tables[0].Rows[0].Field<int>("PN_PhoneTypes_FK");

            //Follow links of Foreign Keys
            DataTable dt = new DataTable();
            string sqlSelect =
                string.Format(
                    "SELECT PT_Description FROM Pensions.dbo.PhoneTypes WHERE PT_PhoneTypes_PK = '{0}'",
                    _phoneTypes_FK);             
            dt = SQLCommon.Instance.SQLSelect(sqlSelect);
            _phoneType = dt.Rows[0].Field<string>("PT_Description");
        }
        catch (Exception e)
        {
            _errMsg = e.Message;
            SAPSCommon.Instance.ShowErrorMsg(e.Message);
        }
    }

    /// <summary>
    /// Format an Australian Phone number
    /// </summary>
    /// <param name="Num">Phone Number to format in string format</param>
    /// <returns>Formatted Phone Number</returns>
    private string FormatPhoneNumber(string Num)
    {
        if (Num.Substring(0, 2) == "04") //Mobile Number
        {
            return string.Format("{0:0### ### ###}", Convert.ToInt64(Num));
        }
        return string.Format("{0:(0#) #### ####}", Convert.ToInt64(Num));
    }

    #endregion Methods 

    public string  Update()
    {
        StringBuilder sb = new StringBuilder("UPDATE [");
        sb.Append(Properties.Settings.Default.SQLDatabaseName);
        sb.Append("].[dbo].[PhoneNumbers] SET PN_Contacts_FK='");
        sb.Append(_contacts_FK);
        sb.Append("', PN_PhoneTypes_FK='");
        sb.Append(_phoneTypes_FK);
        sb.Append("', PN_PhoneNum='");
        sb.Append(_phoneNumber);
        sb.Append("' WHERE PN_PhoneNumbers_PK='");
        sb.Append(_phoneNumbers_PK);
        sb.Append("'");

        _errMsg = SQLCommon.Instance.SQLUpdate(sb.ToString());
        return _errMsg;
    }
}

}

これは、DataGridViewコントロールに入力するコードです。

        private void PopulatePhoneNumbers(clsContacts contacts)
    {
        //Create the 1st column as a textbox for the Phone Number
        DataGridViewTextBoxColumn tb = new DataGridViewTextBoxColumn();
        tb.Name = "PhoneNumber";
        tb.DataPropertyName = "PhoneNumber"; //This is the name of the PhoneNumber object Property for Phone Number

        //Create  2nd column as combobox for PhoneType
        DataGridViewComboBoxColumn cb = new DataGridViewComboBoxColumn();
        cb.Name = "PhoneTypes";
        cb.DataPropertyName = "PhoneTypesFK"; //This is the name of the PhoneNumber object Property for Phone Type

        //Bind the cb to the table
        string sqlQuery = "SELECT PT_PhoneTypes_PK, PT_Description " +
                          "FROM [Pensions].[dbo].[PhoneTypes] ";
        DataTable dtPhoneTypes = SQLCommon.Instance.SQLSelect(sqlQuery);
        cb.DataSource = dtPhoneTypes;
        cb.ValueMember = dtPhoneTypes.Columns["PT_PhoneTypes_PK"].ColumnName;
        cb.DisplayMember = dtPhoneTypes.Columns["PT_Description"].ColumnName;

        uxContactPhoneNumbersGrd.Columns.Add(tb);
        uxContactPhoneNumbersGrd.Columns.Add(cb);

        uxContactPhoneNumbersGrd.AutoGenerateColumns = false;

        if (contacts.PhoneNumbers != null)
        {
            //Show how many phone numbers
            uxContactPhoneNumbersLbl.Text = string.Format("Phone Numbers ({0})", contacts.PhoneNumbers.Count);
            uxContactPhoneNumbersLbl.Visible = true;
            //Fill Grid
            uxContactPhoneNumbersGrd.DataSource = contacts.PhoneNumbers;
            //Hide non-required columns/rows
            uxContactPhoneNumbersGrd.RowHeadersVisible = false;
        }

        //Adjust text column size and auto wrap
        uxContactPhoneNumbersGrd.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
        uxContactPhoneNumbersGrd.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
   }

これが、サポートテーブルを使用してDataGridViewコントロールにオブジェクトからのデータを表示させようとしている他の貧しい人々の助けになることを願っています...

于 2012-12-04T04:16:25.077 に答える