Asked by:
Pass dynamic value CommandArgument

Question
-
User12152485 posted
Dear all,
I using boostrap and using public datatable in inline code.
Anyone help me pass value of datatable rows to CommandArgument button?
I am try like as below but can not get value.
CommandArgument='<%dt.Rows[i]["Manv"].ToString() %>'
Many thanks
for (int i = 0; i < dt.Rows.Count; i++) { zz = zz + 1; string MaNV = dt.Rows[i]["Manv"].ToString(); %> <tr> <td> <%=zz %> </td> <td><%=dt.Rows[i]["Manv"].ToString() %></td> <td><%=dt.Rows[i]["TenNV"].ToString()%></td> <% if (string.IsNullOrEmpty(dt.Rows[i]["START_TIME"].ToString())) { %> <td> <asp:Button ID="btnStart" runat="server" Text="Chấm Vào" class="btn btn-success" CommandArgument='<%dt.Rows[i]["Manv"].ToString() %>' OnClientClick = " return confirm('Bạn có chắc chắn muốn xác nhận giờ vào ?');" OnClick="btnStart_Click" /> </td> <% } else { %> <td> <%=dt.Rows[i]["START_TIME"].ToString() %> </td> <% } %> <% if (!string.IsNullOrEmpty(dt.Rows[i]["START_TIME"].ToString())) { if (string.IsNullOrEmpty(dt.Rows[i]["FINISH_TIME"].ToString())) { %> <td> <asp:Button ID="Button1" runat="server" Text="Chấm Ra" class="btn btn-success" CommandArgument='<%dt.Rows[i]["Manv"].ToString() %>' OnClientClick = " return confirm('Bạn có chắc chắn muốn xác nhận giờ vào ?');" OnClick="Button1_Click" /> </td> <% } else { %> <td> <%=dt.Rows[i]["FINISH_TIME"].ToString() %> </td> <% } } } }
Monday, August 10, 2020 3:09 AM
All replies
-
User-1330468790 posted
Hi mynoicity,
I am afraid that it is not possible to directly use inline code to assign the value to a property of server controls.
There are only two approaches to do that:
- Assign the Button1.CommandArgument = dt.Rows[i]["Manv"];
- Use binding expression <%# "" %> within the data bind method, e.g, add the button inside the repeater and bind the value in the data bind event of the repeater.
According your codes, I suggest you use repeater.
More details, you could refer to below codes:
ASPX:
<form id="form1" runat="server"> <div> <asp:Repeater ID="repeater" runat="server" OnItemCommand="repeater_ItemCommand" OnItemDataBound="repeater_ItemDataBound"> <HeaderTemplate> <table border="1"> <tr> <td><b>Id</b></td> <td><b>Manv</b></td> <td><b>TenNV</b></td> <td><b>START_TIME</b></td> <td><b>FINISH_TIME</b></td> </tr> </HeaderTemplate> <ItemTemplate> <tr> <td><%# Eval("Id") %> </td> <td><%# Eval("Manv") %> </td> <td><%# Eval("TenNV") %> </td> <td> <%# Eval("START_TIME") %> <asp:Button runat="server" ID="btnStart" Text="Start Button" CommandArgument='<%# Eval("Manv") %>' CommandName="start" /> </td> <td> <%# Eval("FINISH_TIME") %> <asp:Button runat="server" ID="Button1" Text="Finish Button" CommandArgument='<%# Eval("Manv")%>' CommandName="finish" /> </td> </tr> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater> Button Clicked: Command Argument is <asp:Label ID="btnCmdArg" runat="server"></asp:Label> </div> </form>
Code behind:
// Simulation of the data private static DataTable _dt; public static DataTable dt { get { if (_dt is null) { _dt = new DataTable(); _dt.Columns.Add("Id", typeof(int)); _dt.Columns.Add("Manv", typeof(string)); _dt.Columns.Add("TenNV", typeof(string)); _dt.Columns.Add("START_TIME", typeof(string)); _dt.Columns.Add("FINISH_TIME", typeof(string)); _dt.Rows.Add(1, "Manv1", "TenNV1", new DateTime(2020,7,1),new DateTime(2020,7,2)); _dt.Rows.Add(2, "Manv2", "TenNV2", new DateTime(2020, 8, 1), new DateTime(2020, 8, 2)); _dt.Rows.Add(3, "Manv3", "TenNV3", new DateTime(2020, 9, 1), null); _dt.Rows.Add(4, "Manv4", "TenNV4", null,null); } return _dt; } set { _dt = value; } } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindRepeater(); } } private void BindRepeater() { repeater.DataSource = dt; repeater.DataBind(); } protected void repeater_ItemCommand(object source, RepeaterCommandEventArgs e) { if (e.CommandName == "start") { btnCmdArg.Text = e.CommandArgument.ToString() + " from button start in row " + e.Item.ItemIndex; } else if (e.CommandName == "finish") { btnCmdArg.Text = e.CommandArgument.ToString() + " from button finish in row " + e.Item.ItemIndex; } } protected void repeater_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { DataRowView dr = (DataRowView)e.Item.DataItem; if (dr["START_TIME"] != DBNull.Value) { ((Button)e.Item.FindControl("btnStart")).Visible = false; if(dr["FINISH_TIME"] != DBNull.Value) { ((Button)e.Item.FindControl("Button1")).Visible = false; } } } }
Demo:
Hope this can help you.
Best regards,
Sean
Tuesday, August 11, 2020 8:53 AM