Announcement

Collapse
No announcement yet.

Cách hiển thị mã và tên trong combobox trong C#

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [C#] Cách hiển thị mã và tên trong combobox trong C#

    Mình có 1 cái combobox!! mình muốn load dữ liệu từ bảng sanpham ( gồm masp và tensp )vào combobox này!! Mình làm thế này nhưng nó chỉ hiển thị mã mà ko hiển thị tên ai bik giúp mình với
    Code:
    DataView dv = new DataView(coso.laybang("sanpham"));
                    cmbmahang.DataSource = dv;
                    cmbmahang.DisplayMember = "InvtID" + " " + "InvtName";
                    cmbmahang.ValueMember = "InvtID";
    hàm laybang mình viết trong lớp coso như thế này
    Code:
    public static DataTable laybang(string tenbang)
            {
                string sql = "select * from " + tenbang;
                SqlCommand cmd = new SqlCommand(sql, coso.cn);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                da.Fill(ds,tenbang);
                return ds.Tables[0];
            }
    Mong mọi người giúp đỡ!! Cảm ơn nhiều!!

  • #2
    Mình viết một lớp Utils để lấy ra wrapper cho table phục vụ cho mục đích hiển thị.
    Hàm này có thể tùy biến với các tham số đầu vào mà cho ra field hiển thị mong muốn.
    Code:
        class TableUtils
        {
            /// <summary>
            /// Get wrapper table for displaying purpose!
            /// </summary>
            /// <param name="core">Original table</param>
            /// <param name="seperateString">A string for seperating members you want to display</param>
            /// <param name="diplayMember">A name for display member</param>
            /// <param name="args">Input members for creating display member</param>
            /// <returns>Display wrapper of input table</returns>
            public static DataTable getTableDisplayWrapper(DataTable core, string seperateString, string diplayMember, params string[] args)
            {
                DataTable wrapper = new DataTable();
                // Make new display column 
                wrapper.Columns.Add(new DataColumn(diplayMember, Type.GetType("System.String")));
                // Copy columns from original table
                foreach(DataColumn columnCore in core.Columns)
                {
                    wrapper.Columns.Add(new DataColumn(columnCore.ColumnName, columnCore.DataType));
                }
                // Copy rows from original table with a new display cell for each row
                foreach(DataRow rowCore in core.Rows) 
                {
                    DataRow rowWrapper = wrapper.NewRow();
                    string displayCell = "";
                    // Create display cell
                    foreach (string arg in args) 
                    {
                        try
                       {
                            displayCell += rowCore[arg] + seperateString;
                       } catch (ArgumentException)
                       {
                            throw new Exception("Invalid data field");
                       }
                    }
                    displayCell = displayCell.Remove(displayCell.Length - seperateString.Length);
                    rowWrapper[diplayMember] = displayCell;
                    // Copy cells from original row
                    foreach (DataColumn columnCore in core.Columns)
                    {
                        // Avoid to make a shallow copy
                        rowWrapper[columnCore.ColumnName] = rowCore[columnCore].ToString();
                    }
                    wrapper.Rows.Add(rowWrapper);
                }
                return wrapper;
            }
    
        }
    Về nguyên tắc thì hàm ComboBox.DisplayMember là chọn field hiển thị (1 field duy nhất nhé) còn ComboBox.ValueMember là lấy về field được chọn. Do bạn set:
    Code:
    cmbmahang.DisplayMember = "InvtID" + " " + "InvtName";
    Cái tham số bạn đưa vào bị coi là invalid, nên mặc định nó lấy thằng
    Code:
    cmbmahang.ValueMember = "InvtID";
    để hiển thị luôn.

    Khi đã có được cái Wrapper như mình code rồi bạn thay cách gọi để hiển thị trên ComboBox như sau:
    Code:
    cmbmahang.ValueMember = "InvtID";DataView v = new DataView(TableUtils.getTableDisplayWrapper(coso.laybang(), " ", "InvtDisplay", "InvtID", "InvtName"));
    comboBox1.DataSource = v;
    comboBox1.DisplayMember = "InvtDisplay";
    comboBox1.ValueMember = "InvtName";
    Mình không rành C# lắm, với cách này nếu dữ liệu trong table không quá lớn thì performance chắc là chấp nhận được :adore:
    Last edited by 08520021; 08-12-2012, 21:34.

    Comment


    • #3
      Xin lỗi hum qua mình ko có máy nên ko test được!!
      Mình làm giống hướng dẫn như trên mà lúc chạy nó không hiển thị cái j hết bạn ơi!!
      Cho mình hỏi cái comboBox1 có phải là cái combobox cmbmahang của mình hay là cái nào khác. Mình viết thế này mà nó ko hiển thị :
      Code:
            cmbmahang.ValueMember = "InvtID"; 
                      DataView v = new DataView(TableUtils.getTableDisplayWrapper(coso.laybang(), " ", "InvtDisplay", "InvtID", "InvtName"));
                      cmbmahang.DataSource = v;
                      cmbmahang.DisplayMember = "InvtDisplay";
                      cmbmahang.ValueMember = "InvtName";
      Mình thấy có 2 dòng cmbmahang.ValueMember nên cũng hơi lạ. nên đã thử khóa 1 trong 2 dòng lại chạy thử nhưng kết quả vẫn vậy. Không bik là bị sai chổ nào giúp mình với!!

      Comment


      • #4
        làm vậy k được thì thủ công phát xem )

        Comment


        • #5
          Hì!! mò một síu cuối cùng cũng bik mình lỗi chổ nào rùi!!
          Tại dòng
          Code:
          cmbmahang.ValueMember = "InvtID";DataView v = new DataView(TableUtils.getTableDisplayWrapper(coso.laybang(), " ", "InvtDisplay", "InvtID", "InvtName"));
          mình chưa cho nó bik là nó lấy dữ liệu ở bảng nào thì làm j có j để cho nó hiển thị hihi ^^ thêm 1 síu chổ này thì ok: coso.laybang() ----> coso.laybang("sanpham")
          Cảm ơn Đỗ Trọng Ân nhiều!!

          Comment


          • #6
            Xin lỗi bạn nha, mấy bữa nay đi làm nên không onl. Vì mình code lại thử, tên comboBox cũng khác nên lúc gửi bài lên forum fix lại tên cho nó giống của bạn mà quên mất, cái sửa cái không. mà dù sao bạn cũng fix được rồi :smile:

            Comment

            LHQC

            Collapse
            Working...
            X