You can use state management design pattern to do this. Here is my example. public partial class MainForm : Form { private readonly MenuCheckStateManager manager; public MainForm() { InitializeComponent(); ToolStripMenuItem redMenu = new ToolStripMenuItem("Red", null, OnMenuClick); ToolStripMenuItem greenMenu = new ToolStripMenuItem("Green", null, OnMenuClick); ToolStripMenuItem blueMenu = new ToolStripMenuItem("Blue", null, OnMenuClick); ToolStripMenuItem colorMenu = new ToolStripMenuItem("Colors", null, redMenu, greenMenu, blueMenu); MenuStrip menuBar = new MenuStrip(); menuBar.Items.Add(colorMenu); this.Controls.Add(menuBar); this.manager = new MenuCheckStateManager(new ToolStripMenuItem[] { redMenu, greenMenu, blueMenu }); } protected override void DestroyHandle() { base.DestroyHandle(); this.manager.Dispose(); } private void OnMenuClick(object sender, EventArgs e) { ToolStripMenuItem menu = (ToolStripMenuItem)sender; this.manager.Change(menu); } }public class MenuCheckStateManager : IDisposable { private IEnumerable<ToolStripMenuItem> menus; public MenuCheckStateManager(IEnumerable<ToolStripMenuItem> menus) { if (menus == null) throw new ArgumentNullException("menus"); this.menus = menus; } public void Change(ToolStripMenuItem menuToCheck) { if (menuToCheck == null) throw new ArgumentNullException("menuToCheck"); foreach (var menu in this.menus.Where(m => !m.Equals(menuToCheck))) { menu.Checked = false; } menuToCheck.Checked = true; } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposing) { lock (this) { this.menus = null; } } } ~MenuCheckStateManager() { Dispose(false); } }
库的话 貌似不行,因为你正常连数据库的话需要一个库名的,如果非要读的话 可以读读 tnsnames.ora 但可以读出某个库的所有表名,每个表的所有列名 /// <summary> /// 查询指定数据库中的所有表,oracle、sqlserver、mysql /// </summary> /// <param name="databasetype"></param> /// <returns></returns> public ArrayList queryTables(string databasetype) { ArrayList list = new ArrayList(); if (databasetype.Equals("Oracle")) { try { string str = "SELECT * FROM user_all_tables order by table_name asc"; OracleDataAdapter da = new OracleDataAdapter(str, oracleconn); DataSet ds = new DataSet(); da.Fill(ds); DataTable dt = ds.Tables[0]; foreach (DataRow dr in dt.Rows) { list.Add(dr[0].ToString().Trim()); } flag = true; return list; } catch (OracleException ee) { MessageBox.Show(ee.Message.ToString()); flag = false; return null; } } else if (databasetype.Equals("SQLServer")) { try { string str = "SELECT * FROM sys.tables"; SqlDataAdapter da = new SqlDataAdapter(str, sqlserverconn); DataSet ds = new DataSet(); da.Fill(ds); DataTable dt = ds.Tables[0]; foreach (DataRow dr in dt.Rows) { list.Add(dr[0].ToString().Trim()); } flag = true; return list; } catch (SqlException ee) { MessageBox.Show(ee.Message.ToString()); flag = false; return null; } } else { try { string str = "show tables"; MySQLDataAdapter da = new MySQLDataAdapter(str, mysqlconn); DataSet ds = new DataSet(); da.Fill(ds); DataTable dt = ds.Tables[0]; foreach (DataRow dr in dt.Rows) { list.Add(dr[0].ToString().Trim()); } flag = true; return list; } catch (MySQLException ee) { MessageBox.Show(ee.Message.ToString()); flag = false; return null; } } }
I added comments in the source code. Because I don't know your technical level, I guess you might need these comments. I also changed LINQ codes into comparison statements. public partial class MainForm : Form { private readonly MenuCheckStateManager manager; public MainForm() { InitializeComponent(); // Create menus ToolStripMenuItem redMenu = new ToolStripMenuItem("Red", null, OnMenuClick); ToolStripMenuItem greenMenu = new ToolStripMenuItem("Green", null, OnMenuClick); ToolStripMenuItem blueMenu = new ToolStripMenuItem("Blue", null, OnMenuClick); ToolStripMenuItem colorMenu = new ToolStripMenuItem("Colors", null, redMenu, greenMenu, blueMenu); MenuStrip menuBar = new MenuStrip(); menuBar.Items.Add(colorMenu); this.Controls.Add(menuBar); // Register checkable menus with MenuCheckStateManager this.manager = new MenuCheckStateManager(new ToolStripMenuItem[] { redMenu, greenMenu, blueMenu }); } protected override void DestroyHandle() { base.DestroyHandle(); // Clear the hold menus, so the menus can be garbage collected this.manager.Dispose(); } private void OnMenuClick(object sender, EventArgs e) { // change menu check state on click ToolStripMenuItem menu = (ToolStripMenuItem)sender; this.manager.Change(menu); } }// Check state manager public class MenuCheckStateManager : IDisposable { private IEnumerable<ToolStripMenuItem> menus; public MenuCheckStateManager(IEnumerable<ToolStripMenuItem> menus) { if (menus == null) throw new ArgumentNullException("menus"); this.menus = menus; } public void Change(ToolStripMenuItem menuToCheck) { if (menuToCheck == null) throw new ArgumentNullException("menuToCheck"); foreach (ToolStripMenuItem menu in this.menus) { menu.Checked = menu == menuToCheck; } } // Implement IDisposable interface. // You can google on the Internet for more information about how to implement IDisposable interface. public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposing) { lock (this) { this.menus = null; } } } ~MenuCheckStateManager() { Dispose(false); } }
public partial class MainForm : Form
{
private readonly MenuCheckStateManager manager; public MainForm()
{
InitializeComponent(); ToolStripMenuItem redMenu = new ToolStripMenuItem("Red", null, OnMenuClick);
ToolStripMenuItem greenMenu = new ToolStripMenuItem("Green", null, OnMenuClick);
ToolStripMenuItem blueMenu = new ToolStripMenuItem("Blue", null, OnMenuClick); ToolStripMenuItem colorMenu = new ToolStripMenuItem("Colors", null, redMenu, greenMenu, blueMenu); MenuStrip menuBar = new MenuStrip();
menuBar.Items.Add(colorMenu); this.Controls.Add(menuBar); this.manager = new MenuCheckStateManager(new ToolStripMenuItem[] { redMenu, greenMenu, blueMenu });
} protected override void DestroyHandle()
{
base.DestroyHandle(); this.manager.Dispose();
} private void OnMenuClick(object sender, EventArgs e)
{
ToolStripMenuItem menu = (ToolStripMenuItem)sender;
this.manager.Change(menu);
}
}public class MenuCheckStateManager : IDisposable
{
private IEnumerable<ToolStripMenuItem> menus; public MenuCheckStateManager(IEnumerable<ToolStripMenuItem> menus)
{
if (menus == null) throw new ArgumentNullException("menus"); this.menus = menus;
} public void Change(ToolStripMenuItem menuToCheck)
{
if (menuToCheck == null) throw new ArgumentNullException("menuToCheck"); foreach (var menu in this.menus.Where(m => !m.Equals(menuToCheck)))
{
menu.Checked = false;
} menuToCheck.Checked = true;
} public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
lock (this)
{
this.menus = null;
}
}
}
~MenuCheckStateManager()
{
Dispose(false);
}
}
但可以读出某个库的所有表名,每个表的所有列名
/// <summary>
/// 查询指定数据库中的所有表,oracle、sqlserver、mysql
/// </summary>
/// <param name="databasetype"></param>
/// <returns></returns>
public ArrayList queryTables(string databasetype)
{
ArrayList list = new ArrayList();
if (databasetype.Equals("Oracle"))
{
try
{
string str = "SELECT * FROM user_all_tables order by table_name asc";
OracleDataAdapter da = new OracleDataAdapter(str, oracleconn);
DataSet ds = new DataSet();
da.Fill(ds);
DataTable dt = ds.Tables[0];
foreach (DataRow dr in dt.Rows)
{
list.Add(dr[0].ToString().Trim());
}
flag = true;
return list;
}
catch (OracleException ee)
{
MessageBox.Show(ee.Message.ToString());
flag = false;
return null;
}
}
else if (databasetype.Equals("SQLServer"))
{
try
{
string str = "SELECT * FROM sys.tables";
SqlDataAdapter da = new SqlDataAdapter(str, sqlserverconn);
DataSet ds = new DataSet();
da.Fill(ds);
DataTable dt = ds.Tables[0];
foreach (DataRow dr in dt.Rows)
{
list.Add(dr[0].ToString().Trim());
}
flag = true;
return list;
}
catch (SqlException ee)
{
MessageBox.Show(ee.Message.ToString());
flag = false;
return null;
}
}
else
{
try
{
string str = "show tables";
MySQLDataAdapter da = new MySQLDataAdapter(str, mysqlconn);
DataSet ds = new DataSet();
da.Fill(ds);
DataTable dt = ds.Tables[0];
foreach (DataRow dr in dt.Rows)
{
list.Add(dr[0].ToString().Trim());
}
flag = true;
return list;
}
catch (MySQLException ee)
{
MessageBox.Show(ee.Message.ToString());
flag = false;
return null;
}
} }
public partial class MainForm : Form
{
private readonly MenuCheckStateManager manager; public MainForm()
{
InitializeComponent(); // Create menus
ToolStripMenuItem redMenu = new ToolStripMenuItem("Red", null, OnMenuClick);
ToolStripMenuItem greenMenu = new ToolStripMenuItem("Green", null, OnMenuClick);
ToolStripMenuItem blueMenu = new ToolStripMenuItem("Blue", null, OnMenuClick); ToolStripMenuItem colorMenu = new ToolStripMenuItem("Colors", null, redMenu, greenMenu, blueMenu); MenuStrip menuBar = new MenuStrip();
menuBar.Items.Add(colorMenu); this.Controls.Add(menuBar); // Register checkable menus with MenuCheckStateManager
this.manager = new MenuCheckStateManager(new ToolStripMenuItem[] { redMenu, greenMenu, blueMenu });
} protected override void DestroyHandle()
{
base.DestroyHandle(); // Clear the hold menus, so the menus can be garbage collected
this.manager.Dispose();
} private void OnMenuClick(object sender, EventArgs e)
{
// change menu check state on click
ToolStripMenuItem menu = (ToolStripMenuItem)sender;
this.manager.Change(menu);
}
}// Check state manager
public class MenuCheckStateManager : IDisposable
{
private IEnumerable<ToolStripMenuItem> menus; public MenuCheckStateManager(IEnumerable<ToolStripMenuItem> menus)
{
if (menus == null) throw new ArgumentNullException("menus"); this.menus = menus;
} public void Change(ToolStripMenuItem menuToCheck)
{
if (menuToCheck == null) throw new ArgumentNullException("menuToCheck"); foreach (ToolStripMenuItem menu in this.menus)
{
menu.Checked = menu == menuToCheck;
}
} // Implement IDisposable interface.
// You can google on the Internet for more information about how to implement IDisposable interface.
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
lock (this)
{
this.menus = null;
}
}
}
~MenuCheckStateManager()
{
Dispose(false);
}
}