none
.net 2.0怎样实现拉线关联 RRS feed

  • 问题

  • 我现在有两个表。两个表里的数据在两个listbox中。现在一个listbox里面的元素要和另外一个里面的进行关联。就如SQL SERVER里面的关系图一样,在一个item上按鼠标不放,拉一条虚线到另一个listbox的item上,这样两个元素就关联起来了。请问这个功能怎么实现?
    其实我就是想让两个表中的元素能让用户方便的关联起来。比如一个表的元素为许多课程,另一个表为星期表。让用户能放表的设置哪个课程是星期几。不要告诉我用一些label,几个textbox。如果上面的比较难实现,给一个好的建议也行。
    勿以恶小而为之,勿以善小而不为
    2009年6月17日 11:14

答案

全部回复

  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    namespace X.WinFormsApp
    {
        /// <summary>
        /// 标题:使用 ListBox 实现简单的产品大类与产品小类的联动
        /// 作者:肖小勇
        /// 日期:2009-06-18
        /// </summary>
        public partial class X200906171951 : Form
        {
            private DataSet fProductClassDS;
            private DataSet fProductSubClassDS;
            private ListBox listBox1;
            private ListBox listBox2;
            private BindingSource fBindingSource1;
            private BindingSource fBindingSource2;
    
            #region " ProductClassDS "
    
            /// <summary>
            /// 产品大类表
            /// </summary>
            public DataSet ProductClassDS
            {
                get
                {
                    if (fProductClassDS == null)
                    {
                        DataTable fProductClassDataTable = new DataTable("ProductClass");
    
                        fProductClassDataTable.Columns.Add(new DataColumn("ProductClassKey", typeof(Int32)));
                        fProductClassDataTable.Columns.Add(new DataColumn("Name", typeof(String)));
    
                        fProductClassDataTable.Rows.Add(new object[] { 1, "手机" });
                        fProductClassDataTable.Rows.Add(new object[] { 2, "笔记本" });
                        fProductClassDataTable.Rows.Add(new object[] { 3, "数码产品" });
    
                        fProductClassDS = new DataSet();
                        fProductClassDS.Tables.Add(fProductClassDataTable);
    
    
                    }
    
                    return fProductClassDS;
                }
            }
    
            #endregion
    
            #region " ProductSubClassDS "
    
            /// <summary>
            /// 产品大类表
            /// </summary>
            public DataSet ProductSubClassDS
            {
                get
                {
                    if (fProductSubClassDS == null)
                    {
                        DataTable fProductSubClassDataTable = new DataTable("ProductSubClass");
    
                        fProductSubClassDataTable.Columns.Add(new DataColumn("ProductSubClassKey", typeof(Int32)));
                        fProductSubClassDataTable.Columns.Add(new DataColumn("ProductClassKey", typeof(Int32)));
                        fProductSubClassDataTable.Columns.Add(new DataColumn("Name", typeof(String)));
    
                        // 手机
                        fProductSubClassDataTable.Rows.Add(new object[] { 1, 1, "NOKIA" });
                        fProductSubClassDataTable.Rows.Add(new object[] { 2, 1, "三星" });
                        fProductSubClassDataTable.Rows.Add(new object[] { 3, 1, "MOTO" });
                        fProductSubClassDataTable.Rows.Add(new object[] { 4, 1, "iPhone" });
                        fProductSubClassDataTable.Rows.Add(new object[] { 5, 1, "索爱" });
                        fProductSubClassDataTable.Rows.Add(new object[] { 6, 1, "多普达" });
                        fProductSubClassDataTable.Rows.Add(new object[] { 7, 1, "LG" });
    
                        //笔记本
                        fProductSubClassDataTable.Rows.Add(new object[] { 8, 2, "ThinkPad" });
                        fProductSubClassDataTable.Rows.Add(new object[] { 9, 2, "DELL" });
                        fProductSubClassDataTable.Rows.Add(new object[] { 10, 2, "SONY" });
                        fProductSubClassDataTable.Rows.Add(new object[] { 11, 2, "苹果" });
                        fProductSubClassDataTable.Rows.Add(new object[] { 12, 2, "联想" });
                        fProductSubClassDataTable.Rows.Add(new object[] { 13, 2, "华硕" });
                        fProductSubClassDataTable.Rows.Add(new object[] { 14, 2, "惠普" });
    
                        //数码产品
                        fProductSubClassDataTable.Rows.Add(new object[] { 15, 3, "MP3" });
                        fProductSubClassDataTable.Rows.Add(new object[] { 16, 3, "MP4" });
                        fProductSubClassDataTable.Rows.Add(new object[] { 17, 3, "MP5" });
                        fProductSubClassDataTable.Rows.Add(new object[] { 18, 3, "iPod" });
                        fProductSubClassDataTable.Rows.Add(new object[] { 19, 3, "录音笔" });
                        fProductSubClassDataTable.Rows.Add(new object[] { 20, 3, "闪存" });
                        fProductSubClassDataTable.Rows.Add(new object[] { 21, 3, "数码相机" });
                        fProductSubClassDataTable.Rows.Add(new object[] { 22, 3, "摄像机" });
           
    
                        fProductSubClassDS = new DataSet();
                        fProductSubClassDS.Tables.Add(fProductSubClassDataTable);
                    }
    
                    return fProductSubClassDS;
                }
            }
    
            #endregion
    
            public X200906171951()
            {
                InitializeComponent();
                this.InitClass();
            }
    
            private void InitClass()
            {
                this.listBox1 = new ListBox();
                this.listBox2 = new ListBox();
                
                this.listBox1.Location = new System.Drawing.Point(12, 12);
                this.listBox1.Size = new System.Drawing.Size(174, 232);
                
                this.listBox2.Location = new System.Drawing.Point(192, 12);
                this.listBox2.Size = new System.Drawing.Size(174, 232);
                
                this.Controls.Add(this.listBox2);
                this.Controls.Add(this.listBox1);
    
                this.listBox1.SelectedIndexChanged += new EventHandler(listBox1_SelectedIndexChanged);
    
                this.fBindingSource1 = new BindingSource(this.ProductClassDS, "ProductClass");
                this.fBindingSource2 = new BindingSource(this.ProductSubClassDS, "ProductSubClass");
    
                // 绑定大类
                this.listBox1.DisplayMember = "Name";
                this.listBox1.ValueMember = "ProductClassKey";
                this.listBox1.DataSource = this.fBindingSource1;
                
                // 绑定小类
                this.listBox2.DisplayMember = "Name";
                this.listBox2.ValueMember = "ProductSubClassKey";
                this.listBox2.DataSource = this.fBindingSource2;
                
            }
    
            private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
            {
                // 根据选择的大类显示相关的小类
                this.fBindingSource2.Filter = string.Format("ProductClassKey = {0}", this.listBox1.SelectedValue); 
            }
        }
    }
    

    知识改变命运,奋斗成就人生!
    2009年6月18日 1:29
    版主
  • 你好。首先谢谢你的回复。我的意思不是选择某项之后出现在另一个表里出现该项对应的项。而是让用户自己设定另一个表里哪些项要和你选定的项对应。就像我们在数据库里建了许多表,然后添加关系图那样,设定项与项之间的关联。为了方便用户操作,我想点击一个表中的项,托这不放拉到另一表的对应项上,这样这两个就关联起来了。
    勿以恶小而为之,勿以善小而不为
    2009年6月18日 2:38
  • .net 控件有拖动事件,关于线条,需要自己画了
    知识改变命运,奋斗成就人生!
    2009年6月18日 2:41
    版主
  • 你好,

    你可以使用LineShape控件(要安装VB PowerPacks)来实现你的需要。

    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年6月19日 6:48
    版主