locked
Pass dynamic value CommandArgument RRS feed

  • 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:

    1. Assign the Button1.CommandArgument = dt.Rows[i]["Manv"];
    2. 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