Jag har ett formulär som innehåller ca 88 st textfält, det skulle bli en grymt lång insert-sats, kan man på nått sätt göra en loop och trycka in allt? textfälten har samma namn som databasfälten...
Lång insert
11 svar · 416 visningar · startad av aleborg
Ja...det bör väl inte vara spec. lurigt....
Använder du SQL-server och en SP?
I så fall kan du göra så här typ:
1. Skapa ett command-objekt mot din SP
2. Loopa igenom alla dina kontroller
3. Kontrollera aktuellt kontrolls-namn och jämför mot ditt command-objekt om namnet finns med som en parameter
4. Finns det med så lägg med parametern med aktuellt namn och värde
5. Kör din SP.
På detta sätt kan du även ha med kontroller som inte finns i databasen.
Kör du inte med SP få du loopa igenom kontrollerna och helt enkelt anta att alla ska vara med, och då skapa SQL-strängen manuellt.
Dim Ctrl As Control
Dim sb As New System.Text.StringBuilder("INSERT INTO Tbl (")
For Each Ctrl In Me.Controls
If TypeOf Ctrl Is TextBox Then
sb.Append(Ctrl.Name)
sb.Append(",")
End If
Next
sb.Remove(sb.Length - 1, 1)
sb.Append(") VALUES (")
For Each Ctrl In Me.Controls
If TypeOf Ctrl Is TextBox Then
sb.Append("'")
sb.Append(Ctrl.Text)
sb.Append("',")
End If
Next
sb.Remove(sb.Length - 1, 1)
sb.Append(")")
Går även att göra bättre...men du ser mönstret iaf...
Kör C# och MySQL :D
Ok...ja då får det bli alternativ 2 då....
Du ser säkert från min VB kod hur det ser ut...
...annars kan säkert nån annan översätta...det är väldigt simpel kod...
Hmmm, får inte riktigt ihop det
StringBuilder sb = new StringBuilder("Insert Into reseller_contacts (");
foreach(Control Ctrl in this.Controls)
{
if(Ctrl.GetType()==TextBox)
sb.Append(Ctrl.NamingContainer+",");
}
Ctrl.Name finns inte och 'System.Web.UI.HtmlControls.HtmlInputText' denotes a 'class' where a 'variable' was expected
Här är koden jag har nu:
StringBuilder sb = new StringBuilder("Insert Into reseller_contacts (");
foreach(Control Ctrl in this.Controls)
{
if(Ctrl is System.Web.UI.HtmlControls.HtmlInputText)
{
sb.Append(Ctrl.ToString());
sb.Append(",");
}
}
sb.Remove(sb.Length -1,1);
sb.Append(") VALUES (");
foreach(Control Ctrl in this.Controls)
{
if(Ctrl is System.Web.UI.HtmlControls.HtmlInputText)
{
sb.Append("'");
sb.Append(Ctrl.ToString());
sb.Append("',");
}
}
sb.Remove(sb.Length - 1, 1);
sb.Append(")");
Response.Write (sb.ToString());
sb.ToString() har jag satt tillfälligt eftersom inte Name kan hittas
Det här får jag ut:
Insert Into reseller_contacts ) VALUES )
någon som har ett tips?
Mitt problem är att alla textfält ligger i en table som är en server kontroll, som i sin tur ligger i en panel:
EX:
<asp:panel id="Step3" runat="server" Visible="True">
<TABLE id="contact" cellSpacing="0" cellPadding="0" border="0" runat="server">
<TR>
<TD><INPUT class="input400" id="c_company" type="text" maxLength="150" name="c_company" runat="server"></TD>
</TR>
</TABLE>
</asp:panel>
Kör jag den här koden:
foreach(Control ctrl in Step3.Controls)
{
Response.Write(ctrl.ID + " " + ctrl.GetType().ToString() + "<br>");
}
så får jag ut:
System.Web.UI.LiteralControl
contact System.Web.UI.HtmlControls.HtmlTable
Om jag lägger inputen utanför tabellen så får jag upp den i listan, men det är tyvärr inget alternativ eftersom tabellen visas beroende på andra inställningar!
Byter jag ut "Step3.Controls" till "contact.Controls" så får jag ut
System.Web.UI.HtmlControls.HtmlTableRow
Hur löser jag det här?
Här får jag fram alla textboxars värde:
<asp:Button ID="btGrr" OnClick="btGrr_Click" Text="Ta fram" Runat="server"/>
<asp:Panel ID="pnlGrr" Runat="server">
<table>
<tr>
<td>
<asp:TextBox ID="tb1" Runat="server"/>
</td>
</tr>
<tr>
<td>
<asp:TextBox ID="tb2" Runat="server"/>
</td>
</tr>
<tr>
<td>
<asp:TextBox ID="tb3" Runat="server"/>
</td>
</tr>
</table>
</asp:Panel>
public void btGrr_Click(object sender, System.EventArgs e)
{
foreach(Control grr in pnlGrr.Controls)
{
if(grr.ToString() == "System.Web.UI.WebControls.TextBox")
{
Response.Write(((TextBox)grr).Text + "<br/>");
}
}
}
Jo, men prova göra <table> till <table id="contact" cellSpacing="0" cellPadding="0" border="0" runat="server">
Här får jag nu fram textboxarnas värde från koden i mitt förra inlägg.
public void btGrr_Click(object sender, System.EventArgs e)
{
foreach(Control grr in pnlGrr.Controls)
{
if(grr.ToString() == "System.Web.UI.HtmlControls.HtmlTable")
{
for (int i=0; i<=tblHmm.Rows.Count - 1; i++)
{
Response.Write("<li>" + ((TextBox)tblHmm.Rows[i].FindControl("tb" + (i + 1))).Text );
}
}
}
}
Fråga. Varför har du runat="server" på tabellen?
Fick det här svaret på ett annat forum:
HtmlControllerna är "Children" till tabellen och den här koden ska fungera, har dock inte testat den än:
foreach(Control ctrTopLvl in Step3.Controls)
{
Response.Write(ctrTopLvl.ID + " " + ctrTopLvl.GetType().ToString() + "<br>");
foreach(Control ctrSecondLvl in ctrTopLvl.Controls)
{
Response.Write(" " + ctrSecondLvl.ID + " " + ctrSecondLvl.GetType().ToString() + "<br>");
}
}
aleborg skrev:
Fick det här svaret på ett annat forum:
HtmlControllerna är "Children" till tabellen och den här koden ska fungera, har dock inte testat den än:foreach(Control ctrTopLvl in Step3.Controls) { Response.Write(ctrTopLvl.ID + " " + ctrTopLvl.GetType().ToString() + "<br>"); foreach(Control ctrSecondLvl in ctrTopLvl.Controls) { Response.Write(" " + ctrSecondLvl.ID + " " + ctrSecondLvl.GetType().ToString() + "<br>"); } }
Nja, eftersom varje ctrSecondLvl också kan ha noll eller flera Controller så skall man loopa rekursivt, och inte så som du har gjort.