我正在構建一個顯示資料庫專案(表、行、FK、...)的 Web 表單
我有一個 CheckBoxList of Tables ( ),每次我從 SelectedIndexChangedchkListTable中顯示一個新的 CheckBoxList of Rows ( ) 。問題是我可以顯示帶有 1 個選定專案的專案。但我不知道如何顯示是否選擇了多個專案。chkListRowchkListTablechkListTablechkListRowchkListTable
這是我的代碼:
aspx:
<div>
<asp:Label ID="Label2" runat="server" Text="Table: "></asp:Label>
<asp:CheckBoxList ID="chkListTable" runat="server"
DataTextField="name"
DataValueFeild="name"
AutoPostBack="true"
OnSelectedIndexChanged="chkListTable_SelectedIndexChanged">
</asp:CheckBoxList>
</div>
<div>
<asp:CheckBoxList ID="chkListRow" runat="server"
DataTextField="COLUMN_NAME"
DataValueField="COLUMN_NAME"
RepeatDirection="Horizontal">
</asp:CheckBoxList>
</div>
aspx.cs:
protected void chkListTable_SelectedIndexChanged(object sender, EventArgs e)
{
tableName.Clear();
foreach (ListItem item in chkListTable.Items)
{
if(item.Selected)
{
tableName.Add(item.Text.Trim());
}
}
for(int i = 0; i < tableName.Count; i )
{
String query = "USE " dbname
" SELECT * FROM information_schema.columns"
" WHERE table_name = '" tableName[i] "'"
" AND COLUMN_NAME != 'rowguid'";
chkListRow.DataSource = Program.ExecSqlDataReader(query);
chkListRow.DataBind();
Program.conn.Close();
}
}
Program.cs:
public static bool Connect()
{
if (Program.conn != null && Program.conn.State == ConnectionState.Open)
Program.conn.Close();
try
{
Program.conn.ConnectionString = Program.constr;
Program.conn.Open();
return true;
}
catch (Exception e)
{
return false;
}
}
public static SqlDataReader ExecSqlDataReader(String query)
{
SqlDataReader myreader;
SqlCommand sqlcmd = new SqlCommand(query, Program.conn);
sqlcmd.CommandType = CommandType.Text;
if (Program.conn.State == ConnectionState.Closed) Program.conn.Open();
try
{
myreader = sqlcmd.ExecuteReader();
return myreader;
myreader.Close();
}
catch (SqlException ex)
{
Program.conn.Close();
return null;
}
}
我希望我的顯示幕是這樣的:
[x]Table1 [x]Table2 [ ]Table3
[ ]Row1(Table1) [ ]Row2(Table1) [ ]Row3(Table1)
[ ]Row1(Table2) [ ]Row2(Table2)
uj5u.com熱心網友回復:
好的,這是一個相當可愛的小問題。
因此,如果我們選擇 1 個表,那么我們需要有一個“子”或所謂的 ONE 復選框串列。
但是,如果我們選擇 2 個表(或 5 個),那么我們需要 2 個(或 5 個)子復選框串列。
換句話說,我們不會使用相同的復選框串列(子),或者嘗試“破壞”我們需要的“N”個復選框串列。
所以,這個“子”集(每個檢查表一個)是不知道的。
所以,我們有這些子復選框串列的“重復”集,對吧?
因此,我們可以(并且應該)使用“中繼器”。中繼器所做的只是“重復”我們想要的任何內容,并且我們“提供”中繼器主表串列。
所以,我們的標記現在看起來像這樣:
<style>
.rBut input {margin-right: 5px; }
.rBut label {margin-right: 15px; }
</style>
<asp:Label ID="Label2" runat="server" Text="Table: "></asp:Label>
<div class="rBut">
<asp:CheckBoxList ID="chkListTable" runat="server"
DataTextField="TABLE_NAME"
DataValueFeild="TABLE_NAME"
AutoPostBack="true" RepeatDirection="Horizontal" OnSelectedIndexChanged="chkListTable_SelectedIndexChanged" >
</asp:CheckBoxList>
</div>
</div>
<div>
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
<ItemTemplate>
Table: <%# Eval("Table") %> -
<div class="rBut">
<asp:CheckBoxList ID="chkListRow" runat="server"
RepeatDirection="Horizontal">
</asp:CheckBoxList>
</div>
</ItemTemplate>
</asp:Repeater>
注意第二個重復器,我們不設定值和文本列 - 我們還不知道它們。您沒有提到要顯示哪些列,但我的大多數表的第一列總是有一個 PK“ID”,所以讓我們將其設為 value 和顯示(DataTextField,給定表中的第二列)。
所以,現在我們建立了第一個選擇的“串列”,(表),然后將那個東西傳遞給轉發器,它會重復。
代碼現在看起來像這樣:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
LoadData();
}
void LoadData()
{
string strSQL = "SELECT TABLE_NAME FROM VideoGames.INFORMATION_SCHEMA.TABLES "
"WHERE TABLE_TYPE = 'BASE TABLE' ORDER BY TABLE_NAME";
chkListTable.DataSource = MyRst(strSQL);
chkListTable.DataBind();
}
protected void chkListTable_SelectedIndexChanged(object sender, EventArgs e)
{
DataTable MyTables = new DataTable();
MyTables.Columns.Add("Table", typeof(string));
foreach (ListItem OneTable in chkListTable.Items)
{
if (OneTable.Selected)
{
DataRow OneRow = MyTables.NewRow();
OneRow["Table"] = OneTable.Value;
MyTables.Rows.Add(OneRow);
}
}
// ok, we have a list of tables, send that to repeater
Repeater1.DataSource = MyTables;
Repeater1.DataBind();
}
public DataTable MyRst(string strSQL)
{
var rst = new DataTable();
using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.VideoGames))
{
using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
{
conn.Open();
rst.Load(cmdSQL.ExecuteReader());
}
}
return rst;
}
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item
| e.Item.ItemType == ListItemType.AlternatingItem)
{
DataRowView rItem = e.Item.DataItem as DataRowView; // get binding data row
CheckBoxList chkListRow = e.Item.FindControl("chkListRow") as CheckBoxList;
string strSQL = "SELECT * FROM " rItem["Table"].ToString();
DataTable MyTable = MyRst(strSQL);
chkListRow.DataValueField = MyTable.Columns[0].ColumnName;
chkListRow.DataTextField = MyTable.Columns[1].ColumnName;
chkListRow.DataSource = MyRst(strSQL);
chkListRow.DataBind();
}
}
所以,現在我們看到了:

如果我單擊一個,那么我會看到:

但是,假設我單擊 3,然后我會看到:

因此,請注意我是如何為 Repeater 提供表的(可能是 sql 查詢,但在這種情況下,我們在代碼中創建表)。將其傳遞給中繼器。
對于每個表,itemdatabound 觸發器。因為表有多個副本,所以我們需要使用查找控制元件。
如果您想測驗/獲取所有選中的專案,那么我們對 Repeater 專案中的每個專案執行一次 - 并再次使用查找控制元件來獲取每個復選框控制元件。
但請注意,我們只有兩個復選框串列,但第二個在該中繼器內部,并且是資料驅動的。
因此,這將適用于 1 個或“N”個表。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/471369.html
