Выбор только одного предмета из класса - PullRequest
1 голос
/ 21 апреля 2011

У меня есть GridView, в котором есть <asp:Label> с ID = "Description" и CssClass = "dsc". В моем C # .net-коде за файлом aspx у меня есть таблица данных, в которой есть адреса и описания из базы данных. Я заполняю карту Google картами Lat / Lng, которые конвертируются из адреса с помощью маленьких маркеров Google. При щелчке маркера описание этого адреса появляется над маркером. Это работает нормально.

Теперь для сложной части, я пытаюсь добавить одно и то же описание к каждой строке в GridView, уникальным образом. Имеет ли это смысл? При щелчке по строке (каждая строка будет иметь заголовок, который является описанием из БД), описание необходимо открыть над маркером на карте 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> с идентификаторами 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>

ПОЖАЛУЙСТА, помогите мне разобраться в этом, я был на этой части в течение недели, и я совершенно ошеломлен. Спасибо, ребята!

1 Ответ

0 голосов
/ 25 апреля 2011

Хорошо, я думаю, что вижу проблему.У вас есть это:

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.Поэтому, даже если вы исправите проблему # 1, изменив текст = на текст + =, ваш код все равно не будет работать.

У вас есть 2 варианта, которые я вижу.Во-первых, вы можете назначить отдельный идентификатор каждому ярлыку в дополнение к классу.Тогда для каждой строки ваш код может быть $('#myID1').click..., где myID1 - уникально сгенерированный идентификатор для каждой строки.Будьте осторожны, если вы делаете это таким образом, так как .net любит генерировать большие уродливые идентификаторы, которые не соответствуют вашим ожиданиям.

Другой вариант, и я бы предпочел просто добавитьнажмите непосредственно на ярлык.Я думаю, что вы должны иметь возможность просто захватить ярлык, в то время как в этом foreach у вас есть в вашем методе привязки данных.Затем вы делаете что-то похожее на это:

theLabel.Attributes.Add("onclick", java2);

Может потребоваться небольшая настройка java2, я не рассматривал это в деталях, но таким образом онклик будет просто прикреплен непосредственно к метке наначальная загрузка без какого-либо JavaScript, чтобы добавить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...