我有一个GridView,其中有<asp:Label>
,ID =“描述”,CssClass =“dsc”。在aspx文件后面的C#.net代码中,我有一个数据表,其中包含数据库中的地址和描述,我使用Lat / Lng coods填充了Google Map,这些coods是使用Google标记从地址转换而来的。单击标记时,该地址的描述将弹出标记上方。这工作正常。
现在,对于困难的部分,我试图将相同的描述添加到GridView中的每一行,唯一的。那有意义吗?单击一行时(每行将有一个标题,即db中的描述),描述需要在Google地图中的标记上方打开。 GridView中的每一行都有自己的描述和地址。
到目前为止,这是我的代码:
public partial class NEW_controls_RoadsAndBridges : System.Web.UI.UserControl
{
private SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"].ToString());
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
getInfo();
}
}
protected void getInfo()
{
try
{
conn.Open();
///
///Check to see if connection is good
///
string selectString = "SELECT Address, Description, Date, Lat, Long FROM D2_ReportAProblemForm ORDER BY id DESC";
SqlCommand cmd = new SqlCommand(selectString, conn);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
adapter.Fill(dt);
BuildScript(dt);
cmd.Dispose();
//If successful
GridView1.DataSource = dt;
GridView1.DataBind();
}
catch (SqlException sqle)
{
//if error
// Response.Redirect("ReportAProblemInfo.aspx?info=fail");
}
finally
{
if (conn != null)
conn.Close();
}
}
private void BuildScript(DataTable tbl)
{
String Locations = "";
String Description = "";
String Address = "";
String java = "";
String java2 = "";
int n = 0;
foreach (DataRow r in tbl.Rows)
{
string Latitude = r["Long"].ToString();
string Longitude = r["Lat"].ToString();
Description = r["Description"].ToString();
Address= r["Address"].ToString();
string marker = "marker" + n.ToString();
// create a line of JavaScript for marker on map for this record
Locations += Environment.NewLine + "var "+marker+@"=new GMarker(new GLatLng(" + Latitude + "," + Longitude + ")); map.addOverlay("+marker+@");";
java += @"GEvent.addListener(" + marker + @", 'click', function()
{
" + marker + @".openInfoWindowHtml('" + Description + @"');
map.checkResize();
map.setCenter(" + marker + @");
});";
java2 += marker+@".openInfoWindowHtml('" + Description + @"');
map.checkResize();
map.setCenter("+marker+@");";
n++;
}
// construct the final script
js.Text =
@"<script type='text/javascript'>
function initialize()
{
if (GBrowserIsCompatible())
{
var map = new GMap2(document.getElementById('map_canvas'),{ size: new GSize(350,300) } );
map.checkResize();
map.setCenter(new GLatLng(35.347769,-98.05),8);
map.openInfoWindow(map.getCenter(), document.createTextNode('Hello'));
" + Locations + java + @"
$(document).ready(function(){
$('.dsc').css('cursor','pointer');
$('.dsc').each(function( intIndex ) {
$(this).bind ('click',function() {
" + java2 + @"
});
});
});
map.setUIToDefault();
}
}
</script> ";
}
protected void GridView1_DataBound(object sender, EventArgs e)
{
string selectString = "SELECT Address, Description, Date, Lat, Long FROM D2_ReportAProblemForm ORDER BY id DESC";
SqlCommand cmd = new SqlCommand(selectString, conn);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
adapter.Fill(dt);
String Locations = "";
String Description = "";
String java2 = "";
int n = 0;
foreach (DataRow r in dt.Rows)
{
string Latitude = r["Long"].ToString();
string Longitude = r["Lat"].ToString();
Description = r["Description"].ToString();
string marker = "marker" + n.ToString();
// create a line of JavaScript for marker on map for this record
Locations += Environment.NewLine + "var " + marker + @"=new GMarker(new GLatLng(" + Latitude + "," + Longitude + ")); map.addOverlay(" + marker + @");";
java2 += marker + @".openInfoWindowHtml('" + Description + @"');
map.checkResize();
map.setCenter(" + marker + @");";
n++;
js2.Text = @"<script type='text/javascript'>
{
$('.dsc').click(function()
{
" + java2 + @"
}
</script> ";
}//end foreach
}//end _DataBound
}
有两个<asp:Literal>
ID js
和js2
,因此我可以将jQuery / JavaScript直接放入C#代码中。
GridView代码:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false"
ondatabound="GridView1_DataBound">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<table width="500px">
<tr style="background-color: #dcdcdc;" >
<td colspan="2" style="text-align: left; font-weight: bold; font-size: 14xp;">
<asp:Label ID="Description" CssClass="dsc" runat="server" Text='<%#Eval ("Description") %>'></asp:Label>
</td>
</tr>
<tr style="text-align: left; font-weight: lighter; font-size: 12px;">
<td>
<%#Eval ("Address") %>
</td>
<td>
<%#Eval ("Date") %>
</td>
</tr>
</table>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
请帮助我解决这个问题,我已经在这一部分工作了一个星期而且我完全难过了。 谢谢你们!
答案 0 :(得分:0)
好的,我想我看到了问题。你有这个:
foreach (DataRow r in dt.Rows){
...
js2.Text = @"<script type='text/javascript'>
{
$('.dsc').click(function()
{
" + java2 + @"
}
</script> ";
}//end foreach
问题在于循环的每次迭代都会消除你在之前所做的事情。 js2.Text=
表示将文本设置为等于此字符串,替换其中已有的字符串。
现在,问题#2。你的jquery如下:
$('.dsc').click(function()
这里的问题是,这将适用于您的每一行,因为每个行都有类dsc。因此,即使您通过将text =更改为文本+ =来解决问题#1,您的代码仍然无效。
我可以看到2个选项。首先,除了类之外,您还可以为每个标签分配不同的ID。然后,对于每一行,您的代码可以是$('#myID1').click...
,其中myID1是每行唯一生成的ID。如果你这样做的话要小心,因为.net喜欢生成大丑丑陋的ID,而这些ID并不是你认为的那样。
另一个选项,我更喜欢的是将onclick直接添加到标签上。我认为你应该能够在你的数据绑定方法的那个foreach中抓住标签。然后你做类似的事情:
theLabel.Attributes.Add("onclick", java2);
可能需要稍微调整一下java2,我没有详细查看它,但是这样onclick只会在初始加载时直接附加到标签上,而无需添加任何javascript。