开始 -〉新建 -〉新建项目 -〉“Windows窗体控件库”
名称栏 里 改为: myControl1
注: 若要添加城市国家区县等记录,请关联着 Area 表一同进行
上代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace myControls1
{
public partial class UserControl1 : UserControl
{
private int LeftComboBox = 90;
private int TopComboBox = 50;
private int LeftRadioButton = 40;
private int TopRadioButton = 48;
private int Vertical = 45;
public int ctWidth = 270;// tabControl 控件 属性
public int ctHeight = 480;
private TabControl tc = new TabControl();
private TabPage tp层级 = new TabPage();
private TabPage tp树型 = new TabPage();
private TreeView tv = new TreeView();
private Button button确定 = new Button();
private RadioButton radioButtonTemp = new RadioButton();//临时的、不可见的
private string connStr = "";
private int _id_返回值 = 0;
public bool flag { get; set; }
public string tab表名1 { get; set; }
public string tab表名2 { get; set; }
public int id_返回值
{
get { return _id_返回值; }
}
private SqlConnection sqlconn;
private DataSet ds = new DataSet();
public UserControl1(string s)//s 系传进来的数据库连接字符串
{
connStr = s;
InitializeComponent();
sqlconn = new SqlConnection(connStr);
flag = false;
}
private void UserControl1_Load(object sender, EventArgs e)
{
setMainControls(tab表名1, tab表名2);
}
///
/// tablename1 和 tablename2 系表名
///
///
///
private void setMainControls(string tablename1, string tablename2)
{
tc.Location = new Point(40, 30);
tc.Width = ctWidth;
tc.Height = ctHeight;
tp层级.Text = "层级";
tp树型.Text = "树型";
tv.Dock = DockStyle.Fill;
tc.Controls.Add(tp层级);
tp树型.Controls.Add(tv);
tc.Controls.Add(tp树型);
this.Controls.Add(tc);
radioButtonTemp.Visible = false;
tp层级.Controls.Add(radioButtonTemp);
button确定.Location = new Point(130, 510);
button确定.Text = "确 定";
button确定.Enabled = false;
this.Controls.Add(button确定);
button确定.Show();
button确定.Click += (s, e) => { ThisButtonClick(_id_返回值); };
setSubControls(null, null, tablename1, tablename2, 1, 0);
}
//递归用
private int xh = 1;
private void setSubControls(DataTable _dt, BindingSource _bs, string tablename1, string tablename2, int layer, int v)
{
TopComboBox += v;
TopRadioButton += v;
if (_dt == null)
{
try
{
DataTable dt1 = new DataTable();
DataTable dt2 = new DataTable();
using (SqlDataAdapter sda1 = new SqlDataAdapter("Select a.ID, a.Name,a.ParentID,a.Layer,b.name as qx from " + tablename1 + " as a," + tablename2 + " as b where a.Layer=" + layer + " and a.Layer=b.ID", sqlconn))
{
sda1.Fill(dt1);
}
using (SqlDataAdapter sda2 = new SqlDataAdapter("Select a.ID, a.Name,a.ParentID,a.Layer,b.name as qx from " + tablename1 + " as a," + tablename2 + " as b where a.Layer=" + (layer + 1) + " and a.Layer=b.ID", sqlconn))
{
sda2.Fill(dt2);
}
ds.Tables.Add(dt1);
ds.Tables.Add(dt2);
string relationsName = "r" + xh.ToString();
ds.Relations.Add(relationsName, dt1.Columns["id"], dt2.Columns["ParentID"]);
BindingSource bs = new BindingSource();
bs.DataSource = ds;
bs.DataMember = ds.Tables[0].ToString();
ComboBox cmb = new ComboBox();
cmb.Left = LeftComboBox;
cmb.Top = TopComboBox;
cmb.DropDownStyle = ComboBoxStyle.DropDownList;
RadioButton rb = new RadioButton();
rb.Left = LeftRadioButton;
rb.Top = TopRadioButton;
rb.Text = dt2.Rows[0]["qx"].ToString().Trim();
rb.Checked = false;
rb.MouseClick += (s, e) => { ThisRadioButtonClick(rb, cmb); };
cmb.SelectedIndexChanged += (s, e) => { ThisComboBoxClick(cmb); };
tp层级.Controls.Add(cmb);
tp层级.Controls.Add(rb);
cmb.Show();
rb.Show();
BindingSource bs1 = new BindingSource();
bs1.DataSource = bs;
bs1.DataMember = relationsName;
cmb.DataSource = bs1;
cmb.DisplayMember = "Name";
cmb.ValueMember = "id";
setSubControls(dt2, bs1, tablename1, tablename2, layer + 1, Vertical);
TreeNode[] root = new TreeNode[dt1.Rows.Count];
for (int i = 0; i < dt1.Rows.Count; i++)
{
root[i] = new TreeNode(dt1.Rows[i]["name"].ToString());
root[i].Tag = int.Parse(dt1.Rows[i]["id"].ToString());
tv.Nodes.Add(root[i]);
tv.AfterSelect += (s, e) => { ThisTreeViewNodeClick(s, e); };
DrawTreeView(root[i], int.Parse(dt1.Rows[i]["layer"].ToString()), int.Parse(dt1.Rows[i]["id"].ToString()), tablename1);
}
}
catch { }
}
else
{
try
{
DataTable dt3 = new DataTable();
using (SqlDataAdapter sda3 = new SqlDataAdapter("Select a.ID,a.Name,a.ParentID,a.Layer,b.name as qx from " + tablename1 + " as a," + tablename2 + " as b where a.Layer=" + (layer + 1) + " and a.Layer=b.ID", sqlconn))
{
sda3.Fill(dt3);
}
ds.Tables.Add(dt3);
xh++;
string relationsName = "r" + xh.ToString();
ds.Relations.Add(relationsName, _dt.Columns["id"], dt3.Columns["ParentID"]);
ComboBox cmb = new ComboBox();
cmb.Left = LeftComboBox;
cmb.Top = TopComboBox;
cmb.DropDownStyle = ComboBoxStyle.DropDownList;
RadioButton rb = new RadioButton();
rb.Left = LeftRadioButton;
rb.Top = TopRadioButton;
rb.Text = dt3.Rows[0]["qx"].ToString().Trim();
rb.Checked = false;
rb.MouseClick += (s, e) => { ThisRadioButtonClick(rb, cmb); };
cmb.SelectedIndexChanged += (s, e) => { ThisComboBoxClick(cmb); };
tp层级.Controls.Add(cmb);
tp层级.Controls.Add(rb);
cmb.Show();
rb.Show();
BindingSource bs2 = new BindingSource();
bs2.DataSource = _bs;
bs2.DataMember = relationsName;
cmb.DataSource = bs2;
cmb.DisplayMember = "Name";
cmb.ValueMember = "id";
setSubControls(dt3, bs2, tablename1, tablename2, layer + 1, Vertical);
}
catch { }
}
}
private void DrawTreeView(TreeNode treeNode, int layer, int id, string tablename)
{
DataTable dt = new DataTable();
if (layer < 5)
{
using (SqlDataAdapter sda = new SqlDataAdapter("Select * from " + tablename + " as s where s.parentid=" + id, sqlconn))
{
sda.Fill(dt);
}
for (int i = 0; i < dt.Rows.Count; i++)
{
TreeNode SonNode = new TreeNode(dt.Rows[i]["name"].ToString());
SonNode.Tag = int.Parse(dt.Rows[i]["id"].ToString());
treeNode.Nodes.Add(SonNode);
DrawTreeView(SonNode, int.Parse(dt.Rows[i]["layer"].ToString()), int.Parse(dt.Rows[i]["id"].ToString()), tablename);
}
}
}
private void ThisButtonClick(int k)
{
flag = true;
button确定.Enabled = false;
}
private void ThisComboBoxClick(ComboBox cmb)
{
radioButtonTemp.Checked = true;
}
private void ThisRadioButtonClick(RadioButton rb, ComboBox cmb)
{
rb.Checked = true;
try
{
_id_返回值 = int.Parse(cmb.SelectedValue.ToString());
button确定.Enabled = true;
}
catch
{
radioButtonTemp.Checked = true;
button确定.Enabled = false;
}
}
//private void treeViewTv_AfterSelect(object sender, TreeViewEventArgs e)
private void ThisTreeViewNodeClick(object sender, TreeViewEventArgs e)
{
_id_返回值 = int.Parse(e.Node.Tag.ToString());
button确定.Enabled = true;
}
}
}
使用:
WinForm 中 调用
1。引用:添加引用 myControl1.dll
2。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
private myControls1.UserControl1 f;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
f = new myControls1.UserControl1("Data Source=LocalHost;Integrated Security=SSPI;Initial Catalog=zl");
f.tab表名1 = "country";
f.tab表名2 = "area";
f.Location = new Point(10, 10);
this.Controls.Add(f);
f.Show();
}
private void timer1_Tick(object sender, EventArgs e)
{
if (f.flag == true)
{
f.flag = false;
MessageBox.Show(f.id_返回值.ToString());//获得了选定的城市的 id 值
}
}
}
}
运行结果:(本想录制个GIF的,没弄成,只得看图了)
该上数据库了:见下图