目前我有两个问题。
问题 1。
我正在尝试更改两个 Panels
的可见性基于什么值 reader
来自reader["Maskine_Type"].ToString()
正如您在下面的代码隐藏中所看到的。
因为面板位于中继器内,所以我也使用:
Panel PanelTilbud = (Panel)Page.FindControl("PanelTilbud");
您再次可以看到下面的内容。
但是,当我运行代码时,它给了我一个
Object reference not set to an instance of an object
PanelTilbud.Visible = true;
我认为是因为它仍然找不到面板。我用中继器外部的面板进行了测试,效果很好。
我还尝试制作中继器 OnItemDataBound="Repeater1_ItemDataBound"
并更改为Panel PanelTilbud = (Panel)e.Item.FindControl("PanelTilbud");
但是后来我收到错误
Insufficient stack to continue executing the program safely
问题2。
在其中一个面板中,我运行此代码
<%# (Eval("Maskine_Tilbud").ToString().Substring(Eval("Maskine_Tilbud").ToString().Length - 2))%>
为了从 Eval("Maskine_Tilbud")
中删除字符串中的前两个字符工作正常,但是数据库中的大多数记录在 Maskine_Tilbud
中都会有一个空值。如果它为空,我会得到错误 StartIndex cannot be less than zero
这是有道理的,但我不知道如何从 Eval("Maskine_Tilbud")
中删除前两个字符
.aspx 标记
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<asp:Panel ID="PanelTilbud" runat="server" Visible="false">
<hr />
<h4 class="radfont text-center">Tilbud! -<%# (Eval("Maskine_Tilbud").ToString().Substring(Eval("Maskine_Tilbud").ToString().Length - 2))%>% pr dag!</h4>
</asp:Panel>
<asp:Panel ID="PanelNormal" runat="server">
<hr />
<h4 class="text-center orangeFont"><%#Eval("Maskine_pris") %><span class="hvidfont">,- pr dag inkl moms</span>
<span class="orangeFont">(<%#Eval("Maskine_Upris") %>,- ekskl)</span>
</h4>
<hr />
</asp:Panel>
</ItemTemplate>
</asp:Repeater>
我的代码隐藏 - 在 Page_Load
SqlConnection conn = new SqlConnection();
conn.ConnectionString = ConfigurationManager.ConnectionStrings["DatabaseConnectionString1"].ToString();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT top 1 * FROM [Maskiner] INNER JOIN Maskine_kategori ON Maskiner.Maskine_Kategorinavn = Maskine_kategori.Maskine_kategori_id WHERE ([Maskine_id] = @Maskine_id)";
cmd.Parameters.Add("@Maskine_id", SqlDbType.Int).Value = Request.QueryString["Maskine_id"];
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
Panel PanelTilbud = (Panel)Page.FindControl("PanelTilbud");
Panel PanelNormal = (Panel)Page.FindControl("PanelNormal");
if (reader.Read())
{
if (reader["Maskine_Type"].ToString() == "Tilbud")
{
PanelTilbud.Visible = true;
PanelNormal.Visible = false;
}
if (reader["Maskine_Type"].ToString() == "Normal")
{
PanelTilbud.Visible = false;
PanelNormal.Visible = true;
}
}
conn.Close();
DataTable select_favorit_db = new DataTable();
SqlDataAdapter dt = new SqlDataAdapter(cmd);
dt.Fill(select_favorit_db);
Repeater1.DataSource = select_favorit_db;
Repeater1.DataBind();
希望您能理解我的问题。
最佳答案
这里的聚会迟到了。只是想我应该补充一点,您可以在页面中拥有方法并在数据绑定(bind)表达式中使用它们。示例:
ASPX:
<form id="form1" runat="server">
<asp:Repeater ID="rep" runat="server">
<ItemTemplate>
<asp:Label ID="lab" runat="server"
Text='<%# Trim2Chars(Eval("test")) %>'></asp:Label>
</ItemTemplate>
</asp:Repeater>
</form>
隐藏代码:
protected void Page_Load(object sender, EventArgs e)
{
//create fake data for demo and bind to repeater
var data = Enumerable.Range(0, 10).Select(i => new { test = "foo " + i });
rep.DataSource = data;
rep.DataBind();
}
public string Trim2Chars(object input)
{
string inputString = input as string;
if (inputString == null)
return "";
if (inputString.Length < 2)
return inputString;
return inputString.Substring(2);
}
这样,您可以使 ASPX 文件更加简洁,并在后面的代码中计算更复杂的数据绑定(bind)表达式。
关于c# - 更改 SqlDataReader 值上的面板可见性并修剪 Eval 字符串 C# 中的前两个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41893522/